Viewport: Changelog + Internals: Renamed viewport mouse fields for consistency (going to add more). (#1542)
This commit is contained in:
parent
c00523dba4
commit
ccc9a22db3
@ -43,6 +43,37 @@ The gamepad/keyboard navigation branch (which has been in the work since July 20
|
||||
Gamepad/keyboard navigation is still marked as Beta and has to be enabled explicitely.
|
||||
Various internal refactors have also been done, as part of the navigation work and as part of the upcoing viewport/docking work.
|
||||
|
||||
VIEWPORT BRANCH
|
||||
(IN PROGRESS, WILL MERGE INTO THE MAIN LISTS WHEN WE MERGE THE BRANCH)
|
||||
|
||||
- Viewport: Added support for multi-viewport [...] blah blah
|
||||
- Viewport: Rendering: the ImDrawData structure now contains 'DisplayPos' and 'DisplaySize' fields. To support multi-viewport, you need to use those values when
|
||||
creating your orthographic projection matrix. Use 'draw_data->DisplaySize' instead of 'io.DisplaySize', and 'draw_data->DisplayPos' instead of (0,0) as the upper-left point.
|
||||
You also need to subtract 'draw_data->DisplayPos' from your scissor rectangles, as scissor rectangles are specified in the space of your target viewport.
|
||||
- Examples: Back-ends have been refactored to separate the platform code (e.g. Win32, Glfw, SDL2) from the renderer code (e.g. DirectX11, OpenGL3, Vulkan).
|
||||
before: imgui_impl_dx11.cpp --> after: imgui_impl_win32.cpp + imgui_impl_dx11.cpp
|
||||
before: imgui_impl_dx12.cpp --> after: imgui_impl_win32.cpp + imgui_impl_dx12.cpp
|
||||
before: imgui_impl_glfw_gl3.cpp --> after: imgui_impl_glfw.cpp + imgui_impl_opengl2.cpp
|
||||
before: imgui_impl_glfw_vulkan.cpp --> after: imgui_impl_glfw.cpp + imgui_impl_vulkan.cpp
|
||||
before: imgui_impl_sdl_gl3.cpp --> after: imgui_impl_sdl2.cpp + imgui_impl_opengl2.cpp
|
||||
before: imgui_impl_sdl_gl3.cpp --> after: imgui_impl_sdl2.cpp + imgui_impl_opengl3.cpp
|
||||
etc.
|
||||
- The idea is what we can now easily combine and maintain back-ends and reduce code redundancy. Integration of imgui into a new/custom engine may also
|
||||
be easier as there is less overlap between "windowing / inputs" and "rendering" code, so you may study or grab one half of the code and not the other.
|
||||
- This change was motivated by the fact that adding support for multi-viewport requires more work from the platform and renderer back-ends, and the
|
||||
amount of redundancy accross files was becoming too difficult to maintain.
|
||||
- Some frameworks (such as the Allegro, Marmalade) handle both the "platform" and "rendering" part, and your custom engine may as well.
|
||||
- Each example still has its own main.cpp which you may refer you to understand how to initialize and glue everything together.
|
||||
- Examples: Win32: Added DPI-related helpers to access DPI features _without_ requiring the latest Windows SDK at compile time, and _without_ requiring Windows 10 at runtime.
|
||||
- Examples: Platforms currently supporting multi-viewport: Win32, Glfw, SDL2.
|
||||
- Examples: Renderers currently supporting multi-viewport: DirectX10, DirectX11, OpenGL2, OpenGL3, Vulkan (WIP).
|
||||
- Examples: All imgui_impl_xxx files now have an individual Changelog at the top of the file, making it easier to follow how back-ends are evolving.
|
||||
- Examples: Vulkan: Added various optional helpers in imgui_impl_vulkan.h (they are used for multi-viewport support) to make the examples main.cpp easier to read.
|
||||
- Examples: Allegro: Renamed imgui_impl_a5.xxx files to imgui_impl_allegro5.xxx, ImGui_ImplA5_** symbols to ImGui_ImplAllegro5_xxx.
|
||||
- Examples: Vulkan+SDL: Added a Vulkan+SDL example. (#1367) [@gmueckl]
|
||||
- Metrics: Added a "Show window begin order" checkbox to visualize the order windows are submitted.
|
||||
- Internal: Settings: Added ReadCloseFn handler to be able to patch/alter a loaded object after all the fields are known.
|
||||
|
||||
Breaking Changes:
|
||||
(IN PROGRESS, WILL ADD TO THIS LIST AS WE WORK ON 1.60)
|
||||
|
||||
|
52
imgui.cpp
52
imgui.cpp
@ -2122,7 +2122,7 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFla
|
||||
}
|
||||
|
||||
// Filter by viewport
|
||||
if (window->Viewport != g.MouseViewport)
|
||||
if (window->Viewport != g.MousePosViewport)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -3250,21 +3250,21 @@ static void ImGui::UpdateMovingWindowDropViewport(ImGuiWindow* window)
|
||||
if (!(g.IO.ConfigFlags & ImGuiConfigFlags_EnableViewports))
|
||||
return;
|
||||
|
||||
ImRect mouse_viewport_rect = g.MouseViewport->GetRect();
|
||||
ImVec2 window_pos_in_mouse_viewport = ConvertPlatformPosToViewportPos(ConvertViewportPosToPlatformPos(window->Pos, window->Viewport), g.MouseViewport);
|
||||
ImRect mouse_viewport_rect = g.MousePosViewport->GetRect();
|
||||
ImVec2 window_pos_in_mouse_viewport = ConvertPlatformPosToViewportPos(ConvertViewportPosToPlatformPos(window->Pos, window->Viewport), g.MousePosViewport);
|
||||
ImRect window_rect_in_mouse_viewport = ImRect(window_pos_in_mouse_viewport, window_pos_in_mouse_viewport + window->Size);
|
||||
if ((g.MouseViewport->Flags & ImGuiViewportFlags_CanHostOtherWindows) && mouse_viewport_rect.Contains(window_rect_in_mouse_viewport))
|
||||
if ((g.MousePosViewport->Flags & ImGuiViewportFlags_CanHostOtherWindows) && mouse_viewport_rect.Contains(window_rect_in_mouse_viewport))
|
||||
{
|
||||
// Drop on an existing viewport
|
||||
ImGuiViewportP* old_viewport = window->Viewport;
|
||||
SetWindowViewportTranslateToPreservePlatformPos(window, window->Viewport, g.MouseViewport);
|
||||
SetWindowViewportTranslateToPreservePlatformPos(window, window->Viewport, g.MousePosViewport);
|
||||
|
||||
// Our current scheme allow any window to land on a viewport, so when that viewport merges, move other windows as well
|
||||
// FIXME-OPT
|
||||
if (window->Flags & ImGuiWindowFlags_FullViewport)
|
||||
for (int n = 0; n < g.Windows.Size; n++)
|
||||
if (g.Windows[n]->Viewport == old_viewport)
|
||||
SetWindowViewportTranslateToPreservePlatformPos(g.Windows[n], old_viewport, g.MouseViewport);
|
||||
SetWindowViewportTranslateToPreservePlatformPos(g.Windows[n], old_viewport, g.MousePosViewport);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3363,8 +3363,8 @@ static void ImGui::UpdateViewports()
|
||||
|
||||
// Destroy
|
||||
if (viewport == viewport_ref) viewport_ref = NULL;
|
||||
if (viewport == g.MouseViewport) g.MouseViewport = NULL;
|
||||
if (viewport == g.MouseLastHoveredViewport) g.MouseLastHoveredViewport = NULL;
|
||||
if (viewport == g.MousePosViewport) g.MousePosViewport = NULL;
|
||||
if (viewport == g.MouseHoveredPrevViewport) g.MouseHoveredPrevViewport = NULL;
|
||||
IM_ASSERT(viewport->RendererUserData == NULL && viewport->PlatformUserData == NULL && viewport->PlatformHandle == NULL);
|
||||
IM_ASSERT(g.PlatformData.Viewports.contains(viewport) == false);
|
||||
IM_DELETE(viewport);
|
||||
@ -3419,7 +3419,7 @@ static void ImGui::UpdateViewports()
|
||||
|
||||
if (!(g.IO.ConfigFlags & ImGuiConfigFlags_EnableViewports))
|
||||
{
|
||||
g.MouseViewport = g.MouseLastViewport = main_viewport;
|
||||
g.MousePosViewport = g.MousePosPrevViewport = main_viewport;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3442,7 +3442,7 @@ static void ImGui::UpdateViewports()
|
||||
viewport_hovered = FindViewportHoveredFromPlatformWindowStack(mouse_platform_pos);
|
||||
}
|
||||
if (viewport_hovered != NULL)
|
||||
g.MouseLastHoveredViewport = viewport_hovered;
|
||||
g.MouseHoveredPrevViewport = viewport_hovered;
|
||||
|
||||
// If reference viewport just has been deleted, use a position relative to the main viewport
|
||||
if (viewport_ref == NULL)
|
||||
@ -3451,9 +3451,9 @@ static void ImGui::UpdateViewports()
|
||||
g.IO.MousePos = ConvertPlatformPosToViewportPos(mouse_platform_pos, viewport_ref);
|
||||
}
|
||||
|
||||
g.MouseLastViewport = g.MouseViewport;
|
||||
g.MouseViewport = viewport_ref;
|
||||
g.MouseViewport->LastFrameAsRefViewport = g.FrameCount;
|
||||
g.MousePosPrevViewport = g.MousePosViewport;
|
||||
g.MousePosViewport = viewport_ref;
|
||||
g.MousePosViewport->LastFrameAsRefViewport = g.FrameCount;
|
||||
|
||||
// When dragging something, always refer to the last hovered viewport (so when we are between viewport, our dragged preview will tend to show in the last viewport)
|
||||
const bool is_mouse_dragging_with_an_expected_destination = g.DragDropActive || (g.MovingWindow != NULL);
|
||||
@ -3461,15 +3461,15 @@ static void ImGui::UpdateViewports()
|
||||
if (is_mouse_dragging_with_an_expected_destination || is_mouse_all_released)
|
||||
{
|
||||
if (is_mouse_dragging_with_an_expected_destination)
|
||||
viewport_hovered = g.MouseLastHoveredViewport;
|
||||
if (viewport_hovered != NULL && viewport_hovered != g.MouseViewport && !(viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
||||
viewport_hovered = g.MouseHoveredPrevViewport;
|
||||
if (viewport_hovered != NULL && viewport_hovered != g.MousePosViewport && !(viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
||||
{
|
||||
g.IO.MousePos = ConvertPlatformPosToViewportPos(ConvertViewportPosToPlatformPos(g.IO.MousePos, g.MouseViewport), viewport_hovered);
|
||||
g.MouseViewport = viewport_hovered;
|
||||
g.IO.MousePos = ConvertPlatformPosToViewportPos(ConvertViewportPosToPlatformPos(g.IO.MousePos, g.MousePosViewport), viewport_hovered);
|
||||
g.MousePosViewport = viewport_hovered;
|
||||
}
|
||||
}
|
||||
|
||||
IM_ASSERT(g.MouseViewport != NULL);
|
||||
IM_ASSERT(g.MousePosViewport != NULL);
|
||||
}
|
||||
|
||||
ImGuiPlatformData* ImGui::GetPlatformData()
|
||||
@ -3698,7 +3698,7 @@ void ImGui::NewFrame()
|
||||
|
||||
// Update mouse input state
|
||||
// If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta
|
||||
if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev) && g.MouseViewport == g.MouseLastViewport)
|
||||
if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev) && g.MousePosViewport == g.MousePosPrevViewport)
|
||||
g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev;
|
||||
else
|
||||
g.IO.MouseDelta = ImVec2(0.0f, 0.0f);
|
||||
@ -3763,7 +3763,7 @@ void ImGui::NewFrame()
|
||||
// - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.
|
||||
g.HoveredWindow = (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoInputs)) ? g.MovingWindow : FindHoveredWindow();
|
||||
g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL;
|
||||
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
||||
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MousePosViewport);
|
||||
|
||||
ImGuiWindow* modal_window = GetFrontMostModalRootWindow();
|
||||
if (modal_window != NULL)
|
||||
@ -4033,7 +4033,7 @@ void ImGui::Shutdown(ImGuiContext* context)
|
||||
g.FontStack.clear();
|
||||
g.OpenPopupStack.clear();
|
||||
g.CurrentPopupStack.clear();
|
||||
g.CurrentViewport = g.MouseViewport = g.MouseLastViewport = g.MouseLastHoveredViewport = NULL;
|
||||
g.CurrentViewport = g.MousePosViewport = g.MousePosPrevViewport = g.MouseHoveredPrevViewport = NULL;
|
||||
for (int i = 0; i < g.Viewports.Size; i++)
|
||||
IM_DELETE(g.Viewports[i]);
|
||||
g.Viewports.clear();
|
||||
@ -4476,7 +4476,7 @@ void ImGui::Render()
|
||||
const ImVec2 pos = g.IO.MousePos - offset;
|
||||
const ImTextureID tex_id = g.IO.Fonts->TexID;
|
||||
const float sc = g.Style.MouseCursorScale;
|
||||
g.OverlayDrawList.PushClipRect(g.MouseViewport->Pos, g.MouseViewport->Pos + g.MouseViewport->Size);
|
||||
g.OverlayDrawList.PushClipRect(g.MousePosViewport->Pos, g.MousePosViewport->Pos + g.MousePosViewport->Size);
|
||||
g.OverlayDrawList.PushTextureID(tex_id);
|
||||
g.OverlayDrawList.AddImage(tex_id, pos + ImVec2(1,0)*sc, pos+ImVec2(1,0)*sc + size*sc, uv[2], uv[3], IM_COL32(0,0,0,48)); // Shadow
|
||||
g.OverlayDrawList.AddImage(tex_id, pos + ImVec2(2,0)*sc, pos+ImVec2(2,0)*sc + size*sc, uv[2], uv[3], IM_COL32(0,0,0,48)); // Shadow
|
||||
@ -4981,7 +4981,7 @@ static ImGuiWindow* FindHoveredWindow()
|
||||
if (window->Flags & ImGuiWindowFlags_NoInputs)
|
||||
continue;
|
||||
IM_ASSERT(window->Viewport);
|
||||
if (window->Viewport != g.MouseViewport)
|
||||
if (window->Viewport != g.MousePosViewport)
|
||||
continue;
|
||||
|
||||
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
|
||||
@ -5009,7 +5009,7 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c
|
||||
const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding);
|
||||
if (!rect_for_touch.Contains(g.IO.MousePos))
|
||||
return false;
|
||||
if (!g.MouseViewport->GetRect().Overlaps(rect_clipped))
|
||||
if (!g.MousePosViewport->GetRect().Overlaps(rect_clipped))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@ -6017,7 +6017,7 @@ static void ImGui::UpdateWindowViewport(ImGuiWindow* window, bool window_pos_set
|
||||
if (!window_is_mouse_tooltip && !current_viewport->GetRect().Contains(window->Rect()))
|
||||
{
|
||||
// Create an undecorated, temporary OS/platform window
|
||||
ImVec2 platform_pos = ConvertViewportPosToPlatformPos(g.IO.MousePos - g.ActiveIdClickOffset, g.MouseViewport);
|
||||
ImVec2 platform_pos = ConvertViewportPosToPlatformPos(g.IO.MousePos - g.ActiveIdClickOffset, g.MousePosViewport);
|
||||
ImGuiViewportFlags viewport_flags = ImGuiViewportFlags_NoDecoration | ImGuiViewportFlags_NoFocusOnAppearing | ImGuiViewportFlags_NoInputs;
|
||||
ImGuiViewportP* viewport = Viewport(window, window->ID, viewport_flags, platform_pos, window->Size);
|
||||
window->Flags |= ImGuiWindowFlags_FullViewport;
|
||||
@ -6033,7 +6033,7 @@ static void ImGui::UpdateWindowViewport(ImGuiWindow* window, bool window_pos_set
|
||||
// This is so we don't require of the multi-viewport windowing back-end to preserve mouse buttons after a window closure, making it easier to implement them.
|
||||
bool preserve_temporary_viewport = g.MovingWindow && g.MovingWindow->RootWindow == window && (window->Viewport->Flags & ImGuiWindowFlags_FullViewport);
|
||||
if (!preserve_temporary_viewport)
|
||||
window->Viewport = g.MouseViewport;
|
||||
window->Viewport = g.MousePosViewport;
|
||||
}
|
||||
}
|
||||
else if (g.NavWindow != NULL && g.NavWindow != window && (flags & ImGuiWindowFlags_Tooltip))
|
||||
|
@ -635,9 +635,9 @@ struct ImGuiContext
|
||||
ImVector<ImGuiViewportP*> Viewports;
|
||||
ImGuiPlatformData PlatformData; // This is essentially the public facing version of the Viewports vector (it is updated in UpdatePlatformWindows and exclude the viewports about to be destroyed)
|
||||
ImGuiViewportP* CurrentViewport;
|
||||
ImGuiViewportP* MouseViewport;
|
||||
ImGuiViewportP* MouseLastViewport;
|
||||
ImGuiViewportP* MouseLastHoveredViewport;
|
||||
ImGuiViewportP* MousePosViewport;
|
||||
ImGuiViewportP* MousePosPrevViewport;
|
||||
ImGuiViewportP* MouseHoveredPrevViewport;
|
||||
|
||||
// Navigation data (for gamepad/keyboard)
|
||||
ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'
|
||||
@ -766,8 +766,8 @@ struct ImGuiContext
|
||||
NextTreeNodeOpenCond = 0;
|
||||
|
||||
CurrentViewport = NULL;
|
||||
MouseViewport = NULL;
|
||||
MouseLastViewport = MouseLastHoveredViewport = NULL;
|
||||
MousePosViewport = NULL;
|
||||
MousePosPrevViewport = MouseHoveredPrevViewport = NULL;
|
||||
|
||||
NavWindow = NULL;
|
||||
NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user