summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-12-01 23:58:00 +0100
committerStanislaw Halik <sthalik@misaki.pl>2022-12-01 23:58:00 +0100
commitdee84335974f43f4d3661c5c7df481310357c24c (patch)
tree0ec8900c6d4768a7ba4af851e010c495c0b74585
parentc9ed7f5a14037a87f74650e4426056cbdec59116 (diff)
main, imgui: use magnum's virtual dpi scale
-rw-r--r--editor/imgui-scenery.cpp2
-rw-r--r--editor/imgui-tiles.cpp8
-rw-r--r--editor/imgui.cpp14
-rw-r--r--floormat/events.hpp2
-rw-r--r--floormat/main.hpp5
-rw-r--r--floormat/settings.hpp2
-rw-r--r--main/draw.cpp27
-rw-r--r--main/events.cpp15
-rw-r--r--main/main-impl.cpp4
-rw-r--r--main/main-impl.hpp2
-rw-r--r--main/setup.cpp3
11 files changed, 43 insertions, 41 deletions
diff --git a/editor/imgui-scenery.cpp b/editor/imgui-scenery.cpp
index f7577a04..85e7516f 100644
--- a/editor/imgui-scenery.cpp
+++ b/editor/imgui-scenery.cpp
@@ -19,7 +19,7 @@ void app::draw_editor_scenery_pane(scenery_editor& ed)
constexpr int ncolumns = 4;
const auto size = ImGui::GetWindowSize();
auto b2 = imgui::begin_table("scenery-table", ncolumns, flags, size);
- const auto row_height = ImGui::GetCurrentContext()->FontSize + 10*dpi;
+ const auto row_height = ImGui::GetCurrentContext()->FontSize + 10*dpi[1];
constexpr auto thumbnail_width = 50;
const auto colwidth_type = ImGui::CalcTextSize("generic").x;
const auto colwidth_group = ImGui::CalcTextSize("MMMMMMMMMMMMMMM").x;
diff --git a/editor/imgui-tiles.cpp b/editor/imgui-tiles.cpp
index 79bf2166..9d84027f 100644
--- a/editor/imgui-tiles.cpp
+++ b/editor/imgui-tiles.cpp
@@ -17,7 +17,7 @@ void app::draw_editor_tile_pane_atlas(tile_editor& ed, StringView name, const st
constexpr Color4 color_perm_selected{1, 1, 1, .7f},
color_selected{1, 0.843f, 0, .8f},
color_hover{0, .8f, 1, .7f};
- const float window_width = ImGui::GetWindowWidth() - 32 * dpi;
+ const float window_width = ImGui::GetWindowWidth() - 32 * dpi[0];
char buf[128];
const auto& style = ImGui::GetStyle();
const auto N = atlas->num_tiles();
@@ -36,7 +36,7 @@ void app::draw_editor_tile_pane_atlas(tile_editor& ed, StringView name, const st
text(" (selected)");
}
const auto len = snformat(buf, "{:d}"_cf, N);
- ImGui::SameLine(window_width - ImGui::CalcTextSize(buf).x - style.FramePadding.x - 4*dpi);
+ ImGui::SameLine(window_width - ImGui::CalcTextSize(buf).x - style.FramePadding.x - 4*dpi[0]);
text({buf, len});
};
if (const auto flags = ImGuiTreeNodeFlags_(ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Framed);
@@ -44,7 +44,7 @@ void app::draw_editor_tile_pane_atlas(tile_editor& ed, StringView name, const st
{
do_caption();
[[maybe_unused]] const raii_wrapper vars[] = {
- push_style_var(ImGuiStyleVar_FramePadding, {2*dpi, 2*dpi}),
+ push_style_var(ImGuiStyleVar_FramePadding, {2*dpi[0], 2*dpi[1]}),
push_style_color(ImGuiCol_ButtonHovered, color_hover),
};
const bool perm_selected = ed.is_permutation_selected(atlas);
@@ -65,7 +65,7 @@ void app::draw_editor_tile_pane_atlas(tile_editor& ed, StringView name, const st
snformat(buf, "##item_{}"_cf, i);
const auto uv = atlas->texcoords_for_id(i);
constexpr ImVec2 size_2 = { TILE_SIZE[0]*.5f, TILE_SIZE[1]*.5f };
- ImGui::ImageButton(buf, (void*)&atlas->texture(), ImVec2(size_2.x * dpi, size_2.y * dpi),
+ ImGui::ImageButton(buf, (void*)&atlas->texture(), ImVec2(size_2.x * dpi[0], size_2.y * dpi[1]),
{ uv[3][0], uv[3][1] }, { uv[0][0], uv[0][1] });
if (ImGui::IsItemClicked(ImGuiMouseButton_Left))
ed.select_tile(atlas, i);
diff --git a/editor/imgui.cpp b/editor/imgui.cpp
index e1b39d07..59196e6f 100644
--- a/editor/imgui.cpp
+++ b/editor/imgui.cpp
@@ -26,7 +26,7 @@ float app::draw_main_menu()
float main_menu_height = 0;
if (auto b = begin_main_menu())
{
- ImGui::SetWindowFontScale(M->dpi_scale());
+ ImGui::SetWindowFontScale(M->dpi_scale().min());
if (auto b = begin_menu("File"))
{
#if 0
@@ -77,7 +77,7 @@ float app::draw_main_menu()
void app::draw_ui()
{
- const auto dpi = M->dpi_scale();
+ const auto dpi = M->dpi_scale().min();
[[maybe_unused]] const auto style_ = style_saver{};
auto& style = ImGui::GetStyle();
auto& ctx = *ImGui::GetCurrentContext();
@@ -107,7 +107,7 @@ void app::draw_fps()
const ImVec2 size = ImGui::CalcTextSize(buf);
ImDrawList& draw = *ImGui::GetForegroundDrawList();
draw.AddText(nullptr, ImGui::GetCurrentContext()->FontSize,
- {M->window_size()[0] - size.x - 3.5f*dpi, 3*dpi}, ImGui::ColorConvertFloat4ToU32({0, 1, 0, 1}), buf);
+ {M->window_size()[0] - size.x - 3.5f*dpi[0], 3*dpi[1]}, ImGui::ColorConvertFloat4ToU32({0, 1, 0, 1}), buf);
}
void app::draw_tile_under_cursor()
@@ -126,7 +126,7 @@ void app::draw_tile_under_cursor()
ImDrawList& draw = *ImGui::GetForegroundDrawList();
draw.AddText(nullptr, ImGui::GetCurrentContext()->FontSize,
- {window_size[0]*.5f - size.x/2, 3*dpi}, (unsigned)-1, buf);
+ {window_size[0]*.5f - size.x/2, 3*dpi[1]}, (unsigned)-1, buf);
}
void app::draw_editor_pane(float main_menu_height)
@@ -143,9 +143,9 @@ void app::draw_editor_pane(float main_menu_height)
active ? M->start_text_input() : M->stop_text_input();
[[maybe_unused]] const raii_wrapper vars[] = {
- push_style_var(ImGuiStyleVar_WindowPadding, {8*dpi, 8*dpi}),
+ push_style_var(ImGuiStyleVar_WindowPadding, {8*dpi[0], 8*dpi[1]}),
push_style_var(ImGuiStyleVar_WindowBorderSize, 0),
- push_style_var(ImGuiStyleVar_FramePadding, {4*dpi, 4*dpi}),
+ push_style_var(ImGuiStyleVar_FramePadding, {4*dpi[0], 4*dpi[1]}),
push_style_color(ImGuiCol_WindowBg, {0, 0, 0, .5}),
push_style_color(ImGuiCol_FrameBg, {0, 0, 0, 0}),
};
@@ -158,7 +158,7 @@ void app::draw_editor_pane(float main_menu_height)
ImGui::SetNextWindowPos({0, main_menu_height+style.WindowPadding.y});
ImGui::SetNextFrameWantCaptureKeyboard(false);
- ImGui::SetNextWindowSize({425 * dpi, window_size[1] - main_menu_height - style.WindowPadding.y});
+ ImGui::SetNextWindowSize({425 * dpi[0], window_size[1] - main_menu_height - style.WindowPadding.y});
if (const auto flags = ImGuiWindowFlags_(ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings);
auto b = begin_window({}, flags))
{
diff --git a/floormat/events.hpp b/floormat/events.hpp
index a70832fd..44e54a05 100644
--- a/floormat/events.hpp
+++ b/floormat/events.hpp
@@ -20,7 +20,7 @@ struct mouse_button_event final {
};
struct mouse_move_event final {
- Vector2i position, relative_position;
+ Vector2i position;
mouse_button buttons = mouse_button_none;
int mods = 0;
};
diff --git a/floormat/main.hpp b/floormat/main.hpp
index af388de4..6c933037 100644
--- a/floormat/main.hpp
+++ b/floormat/main.hpp
@@ -60,12 +60,13 @@ struct floormat_main
virtual struct world& world() noexcept = 0;
virtual SDL_Window* window() noexcept = 0;
- float dpi_scale() const noexcept { return _dpi_scale; }
+ Vector2 dpi_scale() const noexcept { return _dpi_scale; }
[[nodiscard]] static floormat_main* create(floormat_app& app, fm_settings&& options);
protected:
- float _frame_time1 = 0, _frame_time2 = 0, _dpi_scale = 1;
+ float _frame_time1 = 0, _frame_time2 = 0;
+ Vector2 _dpi_scale{1, 1}, _virtual_scale{1, 1};
};
} // namespace floormat
diff --git a/floormat/settings.hpp b/floormat/settings.hpp
index f90e1c97..aed65dea 100644
--- a/floormat/settings.hpp
+++ b/floormat/settings.hpp
@@ -17,7 +17,7 @@ struct fm_settings
fm_DECLARE_DEPRECATED_COPY_ASSIGNMENT(fm_settings);
fm_DECLARE_DEFAULT_MOVE_ASSIGNMENT_(fm_settings);
- Magnum::Math::Vector2<int> resolution{1536, 1152};
+ Magnum::Math::Vector2<int> resolution{1024, 720};
Corrade::Containers::String title{"Test"};
Corrade::Containers::String disabled_extensions; // TODO
bool vsync = true;
diff --git a/main/draw.cpp b/main/draw.cpp
index 2f9bc737..9da9fbd7 100644
--- a/main/draw.cpp
+++ b/main/draw.cpp
@@ -12,11 +12,13 @@
namespace floormat {
-void main_impl::recalc_viewport(Vector2i size) noexcept
+void main_impl::recalc_viewport(Vector2i fb_size, Vector2i win_size) noexcept
{
+ _dpi_scale = dpiScaling();
+ _virtual_scale = Vector2(fb_size) / Vector2(win_size);
update_window_state();
- _shader.set_scale(Vector2{size});
- GL::defaultFramebuffer.setViewport({{}, size });
+ _shader.set_scale(Vector2{fb_size});
+ GL::defaultFramebuffer.setViewport({{}, fb_size });
// -- state ---
using R = GL::Renderer;
@@ -28,17 +30,17 @@ void main_impl::recalc_viewport(Vector2i size) noexcept
GL::Renderer::enable(R::Feature::ScissorTest);
GL::Renderer::enable(R::Feature::DepthClamp);
GL::Renderer::setDepthFunction(R::DepthFunction::Greater);
- GL::Renderer::setScissor({{}, size});
+ GL::Renderer::setScissor({{}, fb_size});
// -- user--
- app.on_viewport_event(size);
+ app.on_viewport_event(fb_size);
}
global_coords main_impl::pixel_to_tile(Vector2d position) const noexcept
{
constexpr Vector2d pixel_size(TILE_SIZE2);
constexpr Vector2d half{.5, .5};
- const Vector2d px = position - Vector2d{windowSize()}*.5 - _shader.camera_offset();
+ const Vector2d px = position - Vector2d{framebufferSize()}*.5 - _shader.camera_offset();
const Vector2d vec = tile_shader::unproject(px*.5) / pixel_size + half;
const auto x = (std::int32_t)std::floor(vec[0]), y = (std::int32_t)std::floor(vec[1]);
return { x, y };
@@ -49,7 +51,7 @@ auto main_impl::get_draw_bounds() const noexcept -> draw_bounds
using limits = std::numeric_limits<std::int16_t>;
auto x0 = limits::max(), x1 = limits::min(), y0 = limits::max(), y1 = limits::min();
- for (const auto win = Vector2d(windowSize());
+ for (const auto win = Vector2d(framebufferSize());
auto p : {pixel_to_tile(Vector2d{0, 0}).chunk(),
pixel_to_tile(Vector2d{win[0]-1, 0}).chunk(),
pixel_to_tile(Vector2d{0, win[1]-1}).chunk(),
@@ -66,7 +68,7 @@ auto main_impl::get_draw_bounds() const noexcept -> draw_bounds
void main_impl::draw_world() noexcept
{
const auto [minx, maxx, miny, maxy] = get_draw_bounds();
- const auto sz = windowSize();
+ const auto sz = framebufferSize();
for (std::int16_t y = miny; y <= maxy; y++)
for (std::int16_t x = minx; x <= maxx; x++)
@@ -99,7 +101,7 @@ void main_impl::draw_world() noexcept
void main_impl::draw_anim() noexcept
{
- const auto sz = windowSize();
+ const auto sz = framebufferSize();
const auto [minx, maxx, miny, maxy] = get_draw_bounds();
_clickable_scenery.clear();
@@ -178,10 +180,11 @@ void main_impl::do_update()
void main_impl::drawEvent()
{
- _dpi_scale = 1;
+#ifndef __linux__
if (int index = SDL_GetWindowDisplayIndex(window()); index >= 0)
- if (float dpi = 96; !SDL_GetDisplayDPI(index, &dpi, nullptr, nullptr))
- _dpi_scale = dpi / 96;
+ if (float hdpi = 96, vdpi = 96; !SDL_GetDisplayDPI(index, nullptr, &hdpi, &vdpi))
+ _dpi_scale = { hdpi / 96, vdpi / 96 };
+#endif
_shader.set_tint({1, 1, 1, 1});
diff --git a/main/events.cpp b/main/events.cpp
index 922b2d23..11076b54 100644
--- a/main/events.cpp
+++ b/main/events.cpp
@@ -9,14 +9,13 @@ namespace floormat {
void main_impl::viewportEvent(Platform::Sdl2Application::ViewportEvent& event)
{
- fm_assert(event.framebufferSize() == event.windowSize());
- recalc_viewport(event.windowSize());
- app.on_viewport_event(event.windowSize());
+ recalc_viewport(event.framebufferSize(), event.windowSize());
+ app.on_viewport_event(event.framebufferSize());
}
void main_impl::mousePressEvent(Platform::Sdl2Application::MouseEvent& event)
{
- app.on_mouse_up_down({event.position(),
+ app.on_mouse_up_down({event.position() * _virtual_scale,
(SDL_Keymod)(std::uint16_t)event.modifiers(),
mouse_button(SDL_BUTTON((std::uint8_t)event.button())),
std::uint8_t(std::min(255, event.clickCount()))},
@@ -25,7 +24,7 @@ void main_impl::mousePressEvent(Platform::Sdl2Application::MouseEvent& event)
void main_impl::mouseReleaseEvent(Platform::Sdl2Application::MouseEvent& event)
{
- app.on_mouse_up_down({event.position(),
+ app.on_mouse_up_down({event.position() * _virtual_scale,
(SDL_Keymod)(std::uint16_t)event.modifiers(),
mouse_button(SDL_BUTTON((std::uint8_t)event.button())),
std::uint8_t(std::min(255, event.clickCount()))},
@@ -34,14 +33,14 @@ void main_impl::mouseReleaseEvent(Platform::Sdl2Application::MouseEvent& event)
void main_impl::mouseMoveEvent(Platform::Sdl2Application::MouseMoveEvent& event)
{
- app.on_mouse_move({event.position(), event.relativePosition(),
- (mouse_button)(std::uint8_t)(std::uint32_t)event.buttons(),
+ app.on_mouse_move({event.position() * _virtual_scale,
+ (mouse_button)(std::uint8_t)std::uint32_t{event.buttons()},
(SDL_Keymod)(std::uint16_t)event.modifiers()});
}
void main_impl::mouseScrollEvent(Platform::Sdl2Application::MouseScrollEvent& event)
{
- app.on_mouse_scroll({event.offset(), event.position(),
+ app.on_mouse_scroll({event.offset(), event.position() * _virtual_scale,
(SDL_Keymod)(std::uint16_t)event.modifiers()});
}
diff --git a/main/main-impl.cpp b/main/main-impl.cpp
index 0790a0d2..1da2d4ee 100644
--- a/main/main-impl.cpp
+++ b/main/main-impl.cpp
@@ -13,7 +13,7 @@ struct world& main_impl::world() noexcept { return _world; }
SDL_Window* main_impl::window() noexcept { return Sdl2Application::window(); }
fm_settings& main_impl::settings() noexcept { return s; }
const fm_settings& main_impl::settings() const noexcept { return s; }
-Vector2i main_impl::window_size() const noexcept { return windowSize(); }
+Vector2i main_impl::window_size() const noexcept { return framebufferSize(); }
tile_shader& main_impl::shader() noexcept { return _shader; }
const tile_shader& main_impl::shader() const noexcept { return _shader; }
bool main_impl::is_text_input_active() const noexcept { return const_cast<main_impl&>(*this).isTextInputActive(); }
@@ -22,7 +22,7 @@ void main_impl::stop_text_input() noexcept { stopTextInput(); }
int main_impl::exec()
{
- recalc_viewport(windowSize());
+ recalc_viewport(framebufferSize(), windowSize());
return Sdl2Application::exec();
}
diff --git a/main/main-impl.hpp b/main/main-impl.hpp
index cc17f9bc..74ed8222 100644
--- a/main/main-impl.hpp
+++ b/main/main-impl.hpp
@@ -86,7 +86,7 @@ private:
bool do_sleep = false;
} dt_expected;
- void recalc_viewport(Vector2i size) noexcept;
+ void recalc_viewport(Vector2i fb_size, Vector2i win_size) noexcept;
void draw_world() noexcept;
void draw_anim() noexcept;
diff --git a/main/setup.cpp b/main/setup.cpp
index 72bf3550..38df0ccf 100644
--- a/main/setup.cpp
+++ b/main/setup.cpp
@@ -20,7 +20,6 @@ main_impl::main_impl(floormat_app& app, fm_settings&& se, int& fake_argc) noexce
else
(void)setSwapInterval(0);
set_fp_mask();
- fm_assert(framebufferSize() == windowSize());
_clickable_scenery.reserve(128);
timeline.start();
}
@@ -58,7 +57,7 @@ auto main_impl::make_conf(const fm_settings& s) -> Configuration
}
return Configuration{}
.setTitle(s.title)
- .setSize(s.resolution, Vector2(1, 1))
+ .setSize(s.resolution, Configuration::DpiScalingPolicy::Virtual)
.setWindowFlags(make_window_flags(s));
}