summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--editor/app.hpp7
-rw-r--r--editor/draw.cpp2
-rw-r--r--editor/events.cpp33
-rw-r--r--editor/imgui.cpp26
-rw-r--r--editor/keys.hpp3
-rw-r--r--editor/update.cpp8
-rw-r--r--main/draw.cpp5
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);