summaryrefslogtreecommitdiffhomepage
path: root/editor
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-25 20:11:31 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-25 20:11:31 +0100
commit61def2af0683013866cc4eecd150b8edf76b97da (patch)
tree166704e99217f8a7db7f24372182190c9b78465d /editor
parenteb8c57873f6120b8e37fefd170b4adcaf929928e (diff)
a
Diffstat (limited to 'editor')
-rw-r--r--editor/app.hpp2
-rw-r--r--editor/draw.cpp33
-rw-r--r--editor/events.cpp2
-rw-r--r--editor/imgui.cpp17
-rw-r--r--editor/keys.hpp3
-rw-r--r--editor/update.cpp9
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();
}
}