From dacf1ca09555aa88789c19ab5012a9165b63643c Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 19 Aug 2024 12:08:56 +0300 Subject: [PATCH] Tweak grid rendering --- source/application.cpp | 66 +++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/source/application.cpp b/source/application.cpp index 7450b3d..b22acb7 100644 --- a/source/application.cpp +++ b/source/application.cpp @@ -459,16 +459,35 @@ namespace gmtk return result; } - void draw_grid(geom::box const & box, float view_level, gfx::painter & painter) + void draw_grid(geom::box const & box, float view_level, gfx::painter & painter, bool solid = false) { - float const grid_width = 0.1f * std::min(box[0].length() / 3.f, std::pow(3.f, -1.f - view_level)); + float const grid_width = 0.05f * std::min(box[0].length() / 3.f, std::pow(3.f, -1.f - view_level)); - auto color = gfx::black.as_color_rgba(); + gfx::color_rgba color = gfx::black; + if (!solid) + color = gfx::light(color, 0.75f); for (int x = 0; x <= 3; ++x) { - painter.line(box.corner(x / 3.f, 0.f), box.corner(x / 3.f, 1.f), grid_width, color, true); - painter.line(box.corner(0.f, x / 3.f), box.corner(1.f, x / 3.f), grid_width, color, true); + if (solid) + { + painter.line(box.corner(x / 3.f, 0.f), box.corner(x / 3.f, 1.f), grid_width, color, true); + painter.line(box.corner(0.f, x / 3.f), box.corner(1.f, x / 3.f), grid_width, color, true); + } + else + { + for (int i = 0; i < 7; ++i) + { + float s = (i - 1.f / 3.f) / 6.f; + float t = (i + 1.f / 3.f) / 6.f; + + s = std::max(s, 0.f); + t = std::min(t, 1.f); + + painter.line(box.corner(x / 3.f, s), box.corner(x / 3.f, t), grid_width, color, true); + painter.line(box.corner(s, x / 3.f), box.corner(t, x / 3.f), grid_width, color, true); + } + } } } @@ -569,7 +588,7 @@ namespace gmtk draw_structure(bbox, transformer{transformer_type::factory}, painter); break; case card_type::zoomer: - draw_grid(bbox, -1.f, painter); + draw_grid(bbox, -1.f, painter, true); break; } } @@ -654,15 +673,34 @@ namespace gmtk }); } - void draw_selection(location const & l, gfx::painter & painter, gfx::color_rgba const & color) + void draw_selection(location const & l, gfx::painter & painter, gfx::color_rgba const & color, bool solid = false) { auto b = l.bbox(); - float s = std::pow(3.f, -l.level) * 0.1f; + float w = std::pow(3.f, -l.level) * 0.05f; - painter.line(b.corner(0, 0), b.corner(1, 0), s, color, true); - painter.line(b.corner(1, 0), b.corner(1, 1), s, color, true); - painter.line(b.corner(1, 1), b.corner(0, 1), s, color, true); - painter.line(b.corner(0, 1), b.corner(0, 0), s, color, true); + if (solid) + { + painter.line(b.corner(0, 0), b.corner(1, 0), w, color, true); + painter.line(b.corner(1, 0), b.corner(1, 1), w, color, true); + painter.line(b.corner(1, 1), b.corner(0, 1), w, color, true); + painter.line(b.corner(0, 1), b.corner(0, 0), w, color, true); + } + else + { + for (int i = 0; i <= 2; ++i) + { + float s = (i - 1.f / 3.f) / 2.f; + float t = (i + 1.f / 3.f) / 2.f; + + s = std::max(s, 0.f); + t = std::min(t, 1.f); + + painter.line(b.corner(s, 0), b.corner(t, 0), w, color, true); + painter.line(b.corner(s, 1), b.corner(t, 1), w, color, true); + painter.line(b.corner(0, s), b.corner(0, t), w, color, true); + painter.line(b.corner(1, s), b.corner(1, t), w, color, true); + } + } } std::uint64_t make_seed() @@ -1227,10 +1265,10 @@ namespace gmtk draw(map_, view_level, painter_); if (selected_) - draw_selection(*selected_, painter_, {255, 0, 0, 255}); + draw_selection(*selected_, painter_, {255, 128, 128, 255}); if (belt_start_) - draw_selection(*belt_start_, painter_, {255, 255, 0, 255}); + draw_selection(*belt_start_, painter_, {255, 191, 128, 255}); { float w = (view_box_[0].length() - view_box_[1].length()) / 2.f;