diff --git a/CMakeLists.txt b/CMakeLists.txt index 34b59b6..8cc2565 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ set (mapgen_VERSION_PATCH 1) file(GLOB SOURCE "src/*.cpp" "include/mapgen/*.h") file(COPY "font.ttf" DESTINATION "bin") file(COPY "images" DESTINATION "bin") +file(COPY "images" DESTINATION "bin") +file(COPY "src/blur.frag" DESTINATION "bin") configure_file ( "${PROJECT_SOURCE_DIR}/MapgenConfig.h.in" diff --git a/mapgen_screenshot.png b/mapgen_screenshot.png index 376de55..04a3596 100644 Binary files a/mapgen_screenshot.png and b/mapgen_screenshot.png differ diff --git a/src/Painter.cpp b/src/Painter.cpp index a4c0e86..b325c16 100644 --- a/src/Painter.cpp +++ b/src/Painter.cpp @@ -16,6 +16,8 @@ #include "mapgen/Walker.hpp" #include "rang.hpp" +#include + // TODO: move ints to utils.cpp template using filterFunc = std::function; template using sortFunc = std::function; @@ -52,6 +54,12 @@ class Painter { bgColor.g = static_cast(color[1] * 255.f); bgColor.b = static_cast(color[2] * 255.f); window->clear(bgColor); + + char spath[100]; + sprintf(spath, "%s/blur.frag", dir.c_str()); + + shader_blur.loadFromFile(spath, sf::Shader::Type::Fragment); + shader_blur.setUniform("blur_radius", 0.004f); }; sf::Font sffont; @@ -69,6 +77,7 @@ class Painter { bool needUpdate = true; sf::Clock clock; std::vector walkers; + sf::Shader shader_blur; std::string get_selfpath() { char buff[PATH_MAX]; @@ -113,6 +122,7 @@ class Painter { public: std::vector polygons; + std::vector waterPolygons; std::vector infoPolygons; std::vector poi; std::vector sprites; @@ -131,6 +141,8 @@ class Painter { bool states = true; bool areas = false; bool showWalkers = true; + bool lables = true; + bool blur = true; bool isIncreasing{true}; @@ -170,7 +182,7 @@ class Painter { if (mapgen->map != nullptr) { sf::Text operation(mapgen->map->status, sffont); operation.setCharacterSize(20); - operation.setColor(sf::Color::White); + operation.setFillColor(sf::Color::White); auto middle = (sf::Vector2f(window->getSize())) / 2.f; operation.setPosition(sf::Vector2f( @@ -325,8 +337,61 @@ class Painter { } } + void drawLables() { + for (auto c : mapgen->map->cities) { + + sf::RectangleShape bg; + bg.setFillColor(sf::Color(50,30,22, 200)); + if (c->isCapital) { + bg.setOutlineColor(c->region->state->color); + } else { + bg.setOutlineColor(sf::Color(200,200,180, 180)); + } + bg.setOutlineThickness(1); + + sf::Text label(c->name, sffont); + label.setCharacterSize(10); + label.setFillColor(sf::Color(255,255,220)); + label.setPosition(sf::Vector2f(c->region->site->x, c->region->site->y + 10)); + + bg.setSize(sf::Vector2f(label.getGlobalBounds().width + 8, 18)); + bg.setPosition(sf::Vector2f(c->region->site->x - 4, c->region->site->y + 7)); + + window->draw(bg); + window->draw(label); + } + } + void drawMap() { if (needUpdate) { + sf::Vector2u windowSize = window->getSize(); + for (auto p : waterPolygons) { + window->draw(p); + } + + if (blur) { + for (auto p : polygons) { + window->draw(p); + } + cachedMap.create(windowSize.x, windowSize.y); + cachedMap.update(*window); + + sf::RectangleShape rectangle; + rectangle.setSize(sf::Vector2f(window->getSize().x, window->getSize().y)); + rectangle.setPosition(0, 0); + rectangle.setTexture(&cachedMap); + + window->draw(rectangle, &shader_blur); + + for (auto p : polygons) { + auto p2 = sf::ConvexShape(p); + p2.setFillColor(bgColor); + p2.setOutlineColor(sf::Color(50,20,0)); + p2.setOutlineThickness(2); + window->draw(p2); + } + } + for (auto p : polygons) { window->draw(p); } @@ -339,11 +404,10 @@ class Painter { window->draw(sprite); } - // if (info) { - // for (auto p : poi) { - // window->draw(p); - // } - // } + if (lables) { + drawLables(); + } + if (states) { drawBorders(); } @@ -368,7 +432,6 @@ class Painter { } drawMark(); - sf::Vector2u windowSize = window->getSize(); cachedMap.create(windowSize.x, windowSize.y); cachedMap.update(*window); needUpdate = false; @@ -377,6 +440,7 @@ class Painter { rectangle.setSize(sf::Vector2f(window->getSize().x, window->getSize().y)); rectangle.setPosition(0, 0); rectangle.setTexture(&cachedMap); + window->draw(rectangle); } } @@ -469,7 +533,7 @@ class Painter { sprintf(mt, "Mapgen [%s] by Averrin", VERSION.c_str()); sf::Text mark(mt, sffont); mark.setCharacterSize(15); - mark.setColor(sf::Color::White); + mark.setFillColor(sf::Color::White); mark.setPosition(sf::Vector2f(windowSize.x - 240, windowSize.y - 25)); window->draw(mark); } @@ -483,6 +547,7 @@ class Painter { void update() { infoPolygons.clear(); polygons.clear(); + waterPolygons.clear(); poi.clear(); sprites.clear(); walkers.clear(); @@ -610,7 +675,11 @@ class Painter { polygon.setFillColor(col); } } - polygons.push_back(polygon); + if (region->megaCluster->isLand) { + polygons.push_back(polygon); + } else { + waterPolygons.push_back(polygon); + } } needUpdate = true; diff --git a/src/Walker.cpp b/src/Walker.cpp index f279754..852681d 100644 --- a/src/Walker.cpp +++ b/src/Walker.cpp @@ -18,7 +18,9 @@ Walker::Walker(City *c, MapGenerator *m) : mapgen(m) { // road = *mapgen->select_randomly(s->roads.begin(), s->roads.end()); reverse = rand() % 2 == 0; shape = new sf::CircleShape(3); - shape->setFillColor(sf::Color::Red); + shape->setFillColor(sf::Color(225,225,190)); + shape->setOutlineColor(sf::Color::Black); + shape->setOutlineThickness(1); road = *select_randomly(c->roads.begin(), c->roads.end()); reverse = road->regions.back()->city == c; if (reverse) { diff --git a/src/application.cpp b/src/application.cpp index c7dcace..5a43ed5 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -105,7 +105,7 @@ class Application { void initMapGen() { seed = std::chrono::system_clock::now().time_since_epoch().count(); mapgen = new MapGenerator(window->getSize().x, window->getSize().y); - //mapgen->setSeed(28167073); + // mapgen->setSeed(28167073); octaves = mapgen->getOctaveCount(); freq = mapgen->getFrequency(); nPoints = mapgen->getPointCount(); @@ -164,7 +164,15 @@ class Application { getScreenshot = true; break; case sf::Keyboard::W: - painter->showWalkers = ! painter->showWalkers; + painter->showWalkers = !painter->showWalkers; + break; + case sf::Keyboard::N: + painter->lables = !painter->lables; + painter->invalidate(); + break; + case sf::Keyboard::B: + painter->blur = !painter->blur; + painter->invalidate(); break; } break; @@ -190,7 +198,7 @@ class Application { ImGui::DrawTabsBackground(); - //TODO: move to separate file + // TODO: move to separate file if (ImGui::AddTab("Generation")) { ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); @@ -274,6 +282,7 @@ class Application { painter->update(); } ImGui::Checkbox("Walkers*", &painter->showWalkers); + ImGui::Checkbox("Lables", &painter->lables); ImGui::TreePop(); } @@ -287,7 +296,11 @@ class Application { "\n[ESC] for exit\n[S] for save screenshot\n[R] for random " "map\n[U] toggle ui\n[H] toggle humidity\n[I] toggle info\n[P] " "toggle pathes\n[RCLICK] toggle selection lock\n" - "[M] for distance ruler"); + "[M] for distance ruler\n" + "[W] toggle walkers\n" + "[B] toggle water blur\n" + "[N] toggle labels\n" + "[A] show state clusters\n"); } if (ImGui::AddTab("Simulation")) { @@ -367,7 +380,7 @@ class Application { mg::getDistance(rulerRegion->site, currentRegion->site)); sf::Text mark(mt, painter->sffont); mark.setCharacterSize(15); - mark.setColor(sf::Color::Black); + mark.setFillColor(sf::Color::Black); mark.setPosition(line[1].position + sf::Vector2f(15.f, 15.f)); window->draw(mark); } diff --git a/src/blur.frag b/src/blur.frag new file mode 100644 index 0000000..b8aba38 --- /dev/null +++ b/src/blur.frag @@ -0,0 +1,20 @@ +uniform sampler2D texture; +uniform float blur_radius; + +void main() +{ + vec2 offx = vec2(blur_radius, 0.0); + vec2 offy = vec2(0.0, blur_radius); + + vec4 pixel = texture2D(texture, gl_TexCoord[0].xy) * 4.0 + + texture2D(texture, gl_TexCoord[0].xy - offx) * 2.0 + + texture2D(texture, gl_TexCoord[0].xy + offx) * 2.0 + + texture2D(texture, gl_TexCoord[0].xy - offy) * 2.0 + + texture2D(texture, gl_TexCoord[0].xy + offy) * 2.0 + + texture2D(texture, gl_TexCoord[0].xy - offx - offy) * 1.0 + + texture2D(texture, gl_TexCoord[0].xy - offx + offy) * 1.0 + + texture2D(texture, gl_TexCoord[0].xy + offx - offy) * 1.0 + + texture2D(texture, gl_TexCoord[0].xy + offx + offy) * 1.0; + + gl_FragColor = gl_Color * (pixel / 16.0); +} diff --git a/src/main.cpp b/src/main.cpp index 0ab95a3..7176b62 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ #include "application.cpp" -std::string VERSION = "0.5.3"; +std::string VERSION = "0.6.1"; int main() {