Archived
1
Fork 0

Clean up a bunch of pass/backend code for imgui

This commit is contained in:
redstrate 2021-10-12 10:52:29 -04:00
parent 5a046ee27a
commit 8205f65a8e
2 changed files with 24 additions and 32 deletions

View file

@ -98,23 +98,20 @@ imgui_backend::imgui_backend() {
ImGuiPlatformMonitor monitor = {}; ImGuiPlatformMonitor monitor = {};
const auto rect = platform::get_monitor_resolution(); const auto monitorArea = platform::get_monitor_resolution();
monitor.MainPos = rect.offset; monitor.MainPos = monitorArea.offset;
monitor.MainSize = rect.extent; monitor.MainSize = monitorArea.extent;
const auto wrect = platform::get_monitor_work_area(); const auto workArea = platform::get_monitor_work_area();
monitor.WorkPos = wrect.offset; monitor.WorkPos = workArea.offset;
monitor.WorkSize = wrect.extent; monitor.WorkSize = workArea.extent;
monitor.DpiScale = platform::get_monitor_dpi(); monitor.DpiScale = platform::get_monitor_dpi();
platform_io.Monitors.push_back(monitor); platform_io.Monitors.push_back(monitor);
platform_io.Platform_CreateWindow = [](ImGuiViewport* viewport) { platform_io.Platform_CreateWindow = [](ImGuiViewport* viewport) {
viewport->Flags = ImGuiViewportFlags_NoDecoration; viewport->PlatformHandle = platform::open_window("", {viewport->Pos, viewport->Size}, WindowFlags::Borderless);
viewport->PlatformHandle = platform::open_window("",
{viewport->Pos, viewport->Size}, WindowFlags::Borderless);
}; };
platform_io.Platform_DestroyWindow = [](ImGuiViewport* viewport) { platform_io.Platform_DestroyWindow = [](ImGuiViewport* viewport) {
@ -127,18 +124,16 @@ imgui_backend::imgui_backend() {
platform::set_window_position(viewport->PlatformHandle, pos); platform::set_window_position(viewport->PlatformHandle, pos);
}; };
platform_io.Platform_GetWindowPos = [](ImGuiViewport* viewport) { platform_io.Platform_GetWindowPos = [](ImGuiViewport* viewport) -> ImVec2 {
auto [x, y] = platform::get_window_position(viewport->PlatformHandle); return platform::get_window_position(viewport->PlatformHandle);
return ImVec2(x, y);
}; };
platform_io.Platform_SetWindowSize = [](ImGuiViewport* viewport, const ImVec2 size) { platform_io.Platform_SetWindowSize = [](ImGuiViewport* viewport, const ImVec2 size) {
platform::set_window_size(viewport->PlatformHandle, size); platform::set_window_size(viewport->PlatformHandle, size);
}; };
platform_io.Platform_GetWindowSize = [](ImGuiViewport* viewport) { platform_io.Platform_GetWindowSize = [](ImGuiViewport* viewport) -> ImVec2 {
auto [x, y] = platform::get_window_size(viewport->PlatformHandle); return platform::get_window_size(viewport->PlatformHandle);
return ImVec2(x, y);
}; };
platform_io.Platform_SetWindowFocus = [](ImGuiViewport* viewport) { platform_io.Platform_SetWindowFocus = [](ImGuiViewport* viewport) {
@ -178,11 +173,12 @@ void imgui_backend::begin_frame(const float delta_time) {
} }
} }
const auto [width, height] = platform::get_window_size(::engine->get_main_window()); const auto size = platform::get_window_size(::engine->get_main_window());
const auto [dw, dh] = platform::get_window_drawable_size(::engine->get_main_window()); const auto drawableSize = platform::get_window_drawable_size(::engine->get_main_window());
io.DisplaySize = ImVec2(width, height); io.DisplaySize = size;
io.DisplayFramebufferScale = ImVec2((float)dw / width, (float)dh / height); io.DisplayFramebufferScale = ImVec2(static_cast<float>(drawableSize.width) / static_cast<float>(size.width),
static_cast<float>(drawableSize.height) / static_cast<float>(size.height));
io.DeltaTime = delta_time; io.DeltaTime = delta_time;
io.KeyCtrl = platform::get_key_down(InputButton::Ctrl); io.KeyCtrl = platform::get_key_down(InputButton::Ctrl);
io.KeyShift = platform::get_key_down(InputButton::Shift); io.KeyShift = platform::get_key_down(InputButton::Shift);

View file

@ -72,16 +72,12 @@ void ImGuiPass::create_render_target_resources(RenderTarget& target) {
void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, RenderTarget& target, const platform::window_ptr index) { void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, RenderTarget& target, const platform::window_ptr index) {
ImDrawData* draw_data = nullptr; ImDrawData* draw_data = nullptr;
if(platform::is_main_window(index)) { if(!(ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable)) {
draw_data = ImGui::GetDrawData(); draw_data = ImGui::GetDrawData();
} else { } else {
auto& io = ImGui::GetPlatformIO(); auto viewport = ImGui::FindViewportByPlatformHandle(index);
for(int i = 1; i < io.Viewports.size(); i++) { if(viewport != nullptr)
if((io.Viewports[i]->Flags & ImGuiViewportFlags_Minimized) == 0) { draw_data = viewport->DrawData;
if(io.Viewports[i]->PlatformHandle == index)
draw_data = io.Viewports[i]->DrawData;
}
}
} }
if(draw_data == nullptr) if(draw_data == nullptr)
@ -103,8 +99,8 @@ void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, RenderTarget& targ
} }
const Matrix4x4 projection = prism::orthographic(draw_data->DisplayPos.x, const Matrix4x4 projection = prism::orthographic(draw_data->DisplayPos.x,
draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x,
draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y + draw_data->DisplaySize.y,
draw_data->DisplayPos.y, draw_data->DisplayPos.y,
0.0f, 0.0f,
1.0f); 1.0f);
@ -158,8 +154,8 @@ void ImGuiPass::load_font(const std::string_view filename) {
font_file->read_all(); font_file->read_all();
io.Fonts->AddFontFromMemoryTTF(font_file->cast_data<unsigned char>(), font_file->size(), 15.0 * platform::get_window_dpi(engine->get_main_window())); io.Fonts->AddFontFromMemoryTTF(font_file->cast_data<unsigned char>(), font_file->size(), 15.0f * platform::get_window_dpi(engine->get_main_window()));
ImGui::GetIO().FontGlobalScale = 1.0 / platform::get_window_dpi(engine->get_main_window()); ImGui::GetIO().FontGlobalScale = 1.0f / platform::get_window_dpi(engine->get_main_window());
} else { } else {
prism::log("Failed to load font file for imgui!"); prism::log("Failed to load font file for imgui!");
return; return;