diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-25 20:11:31 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-25 20:11:31 +0100 |
commit | 61def2af0683013866cc4eecd150b8edf76b97da (patch) | |
tree | 166704e99217f8a7db7f24372182190c9b78465d /editor | |
parent | eb8c57873f6120b8e37fefd170b4adcaf929928e (diff) |
a
Diffstat (limited to 'editor')
-rw-r--r-- | editor/app.hpp | 2 | ||||
-rw-r--r-- | editor/draw.cpp | 33 | ||||
-rw-r--r-- | editor/events.cpp | 2 | ||||
-rw-r--r-- | editor/imgui.cpp | 17 | ||||
-rw-r--r-- | editor/keys.hpp | 3 | ||||
-rw-r--r-- | editor/update.cpp | 9 |
6 files changed, 32 insertions, 34 deletions
diff --git a/editor/app.hpp b/editor/app.hpp index d1d67ac8..64fdb587 100644 --- a/editor/app.hpp +++ b/editor/app.hpp @@ -130,7 +130,7 @@ private: std::array<int, key_set::COUNT> key_modifiers = {}; cursor_state cursor; Optional<global_coords> inspected_scenery; - bool _draw_collision_boxes : 1 = false; + bool _enable_render_bboxes : 1 = false; }; } // namespace floormat diff --git a/editor/draw.cpp b/editor/draw.cpp index 4e175ab4..783ead39 100644 --- a/editor/draw.cpp +++ b/editor/draw.cpp @@ -9,6 +9,7 @@ #include "src/world.hpp" #include <Magnum/Math/Color.h> #include <Magnum/Math/Vector3.h> +#include "src/RTree.hpp" namespace floormat { @@ -60,7 +61,6 @@ void app::draw_cursor() void app::draw_collision_boxes() { -#if 0 const auto [minx, maxx, miny, maxy] = M->get_draw_bounds(); const auto sz = M->window_size(); auto& world = M->world(); @@ -76,33 +76,30 @@ void app::draw_collision_boxes() if (c.empty()) continue; c.ensure_passability(); - auto* lqt = c.lqt_from_collision_type(collision::move); - if (!lqt) - continue; const with_shifted_camera_offset o{shader, pos, {minx, miny}, {maxx, maxy}}; if (floormat_main::check_chunk_visible(shader.camera_offset(), sz)) { - auto bb = lqt->GetLooseBoundingBox(); - bb.left -= bb.width; bb.top -= bb.height; - bb.width *= 2; bb.height *= 2; - auto q = lqt->QueryInsideRegion(bb); - using extractor = std::decay_t<decltype(*lqt)>::BoundingBoxExtractor; - while (!q.EndOfQuery()) - { - loose_quadtree::BoundingBox<std::int16_t> bb{0, 0, 0, 0}; - extractor::ExtractBoundingBox(q.GetCurrent(), &bb); - _wireframe_rect.draw(shader, { Vector3(bb.left+bb.width/2.f, bb.top+bb.height/2.f, 0), Vector2(bb.width, bb.height), 3 }); - q.Next(); - } + constexpr float maxf = 1 << 24, max2f[] = { maxf, maxf }, min2f[] = { -maxf, -maxf }; + auto* rtree = c.rtree(); + using rtree_type = std::decay_t<decltype(*rtree)>; + using rect_type = typename rtree_type::Rect; + rtree->Search(min2f, max2f, [&](std::uint64_t data, const rect_type& rect) { + [[maybe_unused]] auto x = std::bit_cast<collision_data>(data); + Vector2 start(rect.m_min[0], rect.m_min[1]), end(rect.m_max[0], rect.m_max[1]); + auto size = (end - start); + auto center = Vector3(start + size*.5f, 0.f); + _wireframe_rect.draw(shader, { center, size, 3 }); + return true; + }); } } + shader.set_tint({1, 1, 1, 1}); -#endif } void app::draw() { - if (_draw_collision_boxes) + if (_enable_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 d0a57d8b..bec91890 100644 --- a/editor/events.cpp +++ b/editor/events.cpp @@ -123,11 +123,11 @@ auto app::resolve_keybinding(int k_, int mods_) const -> std::tuple<key, int> 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_b | ALT: return { key_collision_boxes, mods }; } } } diff --git a/editor/imgui.cpp b/editor/imgui.cpp index 1accd9e5..10dcc7de 100644 --- a/editor/imgui.cpp +++ b/editor/imgui.cpp @@ -59,11 +59,15 @@ float app::draw_main_menu() can_rotate = ed->is_anything_selected(); else if (auto* ed = _editor.current_scenery_editor()) can_rotate = ed->is_anything_selected(); - bool b_none = false, b_floor = false, b_walls = false, b_rotate = false, b_scenery = false; + 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; ImGui::MenuItem("Select", "1", &b_none); ImGui::MenuItem("Floor", "2", &b_floor); ImGui::MenuItem("Walls", "3", &b_walls); ImGui::MenuItem("Scenery", "4", &b_scenery); + ImGui::MenuItem("Show collisions", "Alt+C", &b_collisions); ImGui::Separator(); ImGui::MenuItem("Rotate", "R", &b_rotate, can_rotate); if (b_none) @@ -74,16 +78,11 @@ float app::draw_main_menu() do_key(key_mode_walls); else if (b_scenery) do_key(key_mode_scenery); + else if (b_collisions) + do_key(key_mode_collisions); if (b_rotate) do_key(key_rotate_tile); } - if (auto b = begin_menu("View")) - { - bool show_collisions = _draw_collision_boxes; - ImGui::MenuItem("Collision boxes", "Alt+B", &show_collisions); - if (show_collisions) - do_key(key_collision_boxes); - } main_menu_height = ImGui::GetContentRegionMax().y; } @@ -105,7 +104,7 @@ void app::draw_ui() const float main_menu_height = draw_main_menu(); [[maybe_unused]] auto font = font_saver{ctx.FontSize*dpi}; - if (_editor.mode() != editor_mode::none) + if (_editor.current_tile_editor() || _editor.current_scenery_editor()) draw_editor_pane(main_menu_height); draw_fps(); draw_tile_under_cursor(); diff --git a/editor/keys.hpp b/editor/keys.hpp index 3311a69c..eb1ed7db 100644 --- a/editor/keys.hpp +++ b/editor/keys.hpp @@ -16,8 +16,7 @@ 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_collision_boxes, + key_mode_none, key_mode_floor, key_mode_walls, key_mode_scenery, key_mode_collisions, key_GLOBAL, key_new_file, key_quit, diff --git a/editor/update.cpp b/editor/update.cpp index 0a9141f0..2b693526 100644 --- a/editor/update.cpp +++ b/editor/update.cpp @@ -56,6 +56,7 @@ void app::do_mouse_up_down(std::uint8_t button, bool is_down, int mods) switch (_editor.mode()) { default: + break; case editor_mode::none: if (button == mouse_button_left) if (auto* s = find_clickable_scenery(*cursor.pixel); s && s->item.can_activate(s->atlas)) @@ -119,8 +120,8 @@ void app::do_key(key k, int mods) return _editor.set_mode(editor_mode::walls); case key_mode_scenery: return _editor.set_mode(editor_mode::scenery); - case key_collision_boxes: - return void(_draw_collision_boxes = !_draw_collision_boxes); + case key_mode_collisions: + return void(_enable_render_bboxes = !_enable_render_bboxes); case key_quicksave: return do_quicksave(); case key_quickload: @@ -151,8 +152,10 @@ void app::update_world(float dt) if (auto [atlas, scenery] = x.scenery(); atlas != nullptr) { auto pass0 = scenery.passability; + auto offset0 = scenery.bbox_offset; + auto size0 = scenery.bbox_size; scenery.update(dt, *atlas); - if (pass0 != scenery.passability) + if (pass0 != scenery.passability || offset0 != scenery.offset || size0 != scenery.bbox_size) c.mark_scenery_modified(); } } |