diff options
-rw-r--r-- | editor/app.hpp | 7 | ||||
-rw-r--r-- | editor/draw.cpp | 2 | ||||
-rw-r--r-- | editor/events.cpp | 33 | ||||
-rw-r--r-- | editor/imgui.cpp | 26 | ||||
-rw-r--r-- | editor/keys.hpp | 3 | ||||
-rw-r--r-- | editor/update.cpp | 8 | ||||
-rw-r--r-- | main/draw.cpp | 5 |
7 files changed, 58 insertions, 26 deletions
diff --git a/editor/app.hpp b/editor/app.hpp index 526582ae..ada61331 100644 --- a/editor/app.hpp +++ b/editor/app.hpp @@ -104,6 +104,7 @@ private: void do_escape(); void draw_collision_boxes(); + void draw_clickables(); void draw_editor_pane(float main_menu_height); void draw_inspector(); bool check_inspector_exists(popup_target p); @@ -148,8 +149,10 @@ private: std::vector<popup_target> inspectors; cursor_state cursor; popup_target _popup_target; - bool _enable_render_bboxes : 1 = false; - bool _pending_popup : 1 = false; + + bool _pending_popup : 1 = false; + bool _render_bboxes : 1 = false; + bool _render_clickables : 1 = false; static const StringView SCENERY_POPUP_NAME; }; diff --git a/editor/draw.cpp b/editor/draw.cpp index f1a0616c..92f0ea47 100644 --- a/editor/draw.cpp +++ b/editor/draw.cpp @@ -138,7 +138,7 @@ void app::draw_collision_boxes() void app::draw() { - if (_enable_render_bboxes) + if (_render_bboxes) draw_collision_boxes(); if (_editor.current_tile_editor() || _editor.current_scenery_editor()) draw_cursor(); diff --git a/editor/events.cpp b/editor/events.cpp index 08a3e766..cd3e4b9a 100644 --- a/editor/events.cpp +++ b/editor/events.cpp @@ -122,22 +122,23 @@ auto app::resolve_keybinding(int k_, int mods_) const -> std::tuple<key, int> switch (int mods = k2 & kmod_mask; k2) { default: continue; - case SDLK_w: return { key_camera_up, mods }; - case SDLK_a: return { key_camera_left, mods }; - case SDLK_s: return { key_camera_down, mods }; - case SDLK_d: return { key_camera_right, mods }; - case SDLK_HOME: return { key_camera_reset, mods }; - case SDLK_r: return { key_rotate_tile, mods }; - case SDLK_1: return { key_mode_none, mods }; - case SDLK_2: return { key_mode_floor, mods }; - case SDLK_3: return { key_mode_walls, mods }; - case SDLK_4: return { key_mode_scenery, mods }; - case SDLK_c | ALT: return { key_mode_collisions, mods }; - case SDLK_F5: return { key_quicksave, mods }; - case SDLK_F9: return { key_quickload, mods }; - case SDLK_q | CTRL: return { key_quit, mods }; - case SDLK_n | CTRL: return { key_new_file, mods }; - case SDLK_ESCAPE: return { key_escape, mods }; + case SDLK_w: return { key_camera_up, mods }; + case SDLK_a: return { key_camera_left, mods }; + case SDLK_s: return { key_camera_down, mods }; + case SDLK_d: return { key_camera_right, mods }; + case SDLK_HOME: return { key_camera_reset, mods }; + case SDLK_r: return { key_rotate_tile, mods }; + case SDLK_1: return { key_mode_none, mods }; + case SDLK_2: return { key_mode_floor, mods }; + case SDLK_3: return { key_mode_walls, mods }; + case SDLK_4: return { key_mode_scenery, mods }; + case SDLK_c | ALT: return { key_render_collision_boxes, mods }; + case SDLK_l | ALT: return { key_render_clickables, mods }; + case SDLK_F5: return { key_quicksave, mods }; + case SDLK_F9: return { key_quickload, mods }; + case SDLK_q | CTRL: return { key_quit, mods }; + case SDLK_n | CTRL: return { key_new_file, mods }; + case SDLK_ESCAPE: return { key_escape, mods }; } } } diff --git a/editor/imgui.cpp b/editor/imgui.cpp index 78248be3..535f028b 100644 --- a/editor/imgui.cpp +++ b/editor/imgui.cpp @@ -4,6 +4,8 @@ #include "imgui-raii.hpp" #include "src/world.hpp" #include "src/anim-atlas.hpp" +#include "floormat/main.hpp" +#include "main/clickable.hpp" #include <Corrade/Containers/Optional.h> #include <Magnum/Math/Color.h> @@ -67,7 +69,8 @@ float app::draw_main_menu() auto mode = _editor.mode(); using m = editor_mode; bool b_none = mode == m::none, b_floor = mode == m::floor, b_walls = mode == m::walls, - b_rotate = false, b_scenery = mode == m::scenery, b_collisions = _enable_render_bboxes; + b_rotate = false, b_scenery = mode == m::scenery, + b_collisions = _render_bboxes, b_clickables = _render_clickables; if (ImGui::MenuItem("Select", "1", &b_none)) do_key(key_mode_none); if (ImGui::MenuItem("Floor", "2", &b_floor)) @@ -77,7 +80,9 @@ float app::draw_main_menu() if (ImGui::MenuItem("Scenery", "4", &b_scenery)) do_key(key_mode_scenery); if (ImGui::MenuItem("Show collisions", "Alt+C", &b_collisions)) - do_key(key_mode_collisions); + do_key(key_render_collision_boxes); + if (ImGui::MenuItem("Show clickables", "Alt+L", &b_clickables)) + do_key(key_render_clickables); ImGui::Separator(); if (ImGui::MenuItem("Rotate", "R", &b_rotate, can_rotate)) do_key(key_rotate_tile); @@ -101,6 +106,9 @@ void app::draw_ui() ImGui::GetIO().IniFilename = nullptr; _imgui.newFrame(); + if (_render_clickables) + draw_clickables(); + const float main_menu_height = draw_main_menu(); [[maybe_unused]] auto font = font_saver{ctx.FontSize*dpi}; if (_editor.current_tile_editor() || _editor.current_scenery_editor()) @@ -155,6 +163,20 @@ void app::draw_tile_under_cursor() {window_size[0]*.5f - size.x/2, 3*dpi[1]}, (unsigned)-1, buf); } +void app::draw_clickables() +{ + ImDrawList& draw = *ImGui::GetForegroundDrawList(); + const auto color = ImGui::ColorConvertFloat4ToU32({0, .8f, .8f, .95f}); + + for (const auto& x : M->clickable_scenery()) + { + auto dest = Math::Range2D<float>(x.dest); + auto min = dest.min(), max = dest.max(); + draw.AddRect({ min.x(), min.y() }, { max.x(), max.y() }, + color, 0, ImDrawFlags_None, 2.5f); + } +} + void app::draw_editor_pane(float main_menu_height) { auto* ed = _editor.current_tile_editor(); diff --git a/editor/keys.hpp b/editor/keys.hpp index eb7158ec..982e3c4a 100644 --- a/editor/keys.hpp +++ b/editor/keys.hpp @@ -16,7 +16,8 @@ enum key : unsigned { key_camera_up, key_camera_left, key_camera_right, key_camera_down, key_camera_reset, key_NO_REPEAT, key_rotate_tile, - key_mode_none, key_mode_floor, key_mode_walls, key_mode_scenery, key_mode_collisions, + key_mode_none, key_mode_floor, key_mode_walls, key_mode_scenery, + key_render_collision_boxes, key_render_clickables, key_GLOBAL, key_new_file, key_quit, diff --git a/editor/update.cpp b/editor/update.cpp index 3c8f9777..e784ef86 100644 --- a/editor/update.cpp +++ b/editor/update.cpp @@ -171,8 +171,10 @@ void app::do_key(key k, int mods) return do_set_mode(editor_mode::walls); case key_mode_scenery: return do_set_mode(editor_mode::scenery); - case key_mode_collisions: - return void(_enable_render_bboxes = !_enable_render_bboxes); + case key_render_collision_boxes: + return void(_render_bboxes = !_render_bboxes); + case key_render_clickables: + return void(_render_clickables = !_render_clickables); case key_quicksave: return do_quicksave(); case key_quickload: @@ -214,7 +216,7 @@ void app::set_cursor() { auto& w = M->world(); auto [c, t] = w[{cl->chunk, cl->pos}]; - if (auto sc = t.scenery(); sc && sc.can_activate()) + if (auto sc = t.scenery()) { M->set_cursor(std::uint32_t(Cursor::Hand)); return; diff --git a/main/draw.cpp b/main/draw.cpp index 2c8ebc7b..57623eef 100644 --- a/main/draw.cpp +++ b/main/draw.cpp @@ -107,7 +107,6 @@ void main_impl::draw_world() noexcept _floor_mesh.draw(_shader, c); } - _clickable_scenery.clear(); GL::Renderer::enable(GL::Renderer::Feature::DepthTest); GL::defaultFramebuffer.clearDepthStencil(0, 0); for (std::int16_t y = miny; y <= maxy; y++) @@ -122,7 +121,10 @@ void main_impl::draw_world() noexcept _wall_mesh.draw(_shader, c); } + _clickable_scenery.clear(); + GL::Renderer::setDepthMask(false); + for (std::int16_t y = miny; y <= maxy; y++) for (std::int16_t x = minx; x <= maxx; x++) { @@ -142,6 +144,7 @@ void main_impl::draw_world() noexcept } } } + GL::Renderer::setDepthMask(true); GL::Renderer::disable(GL::Renderer::Feature::DepthTest); |