Nav: Caching into g.NavAnyRequest to minimize hot path cost (and so we can add many more request sources)
This commit is contained in:
parent
d91b093be6
commit
d2975115cd
26
imgui.cpp
26
imgui.cpp
@ -2171,6 +2171,19 @@ static bool NavScoreItem(ImRect cand)
|
|||||||
return new_best;
|
return new_best;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void NavUpdateAnyRequestFlag()
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
g.NavAnyRequest = g.NavMoveRequest || g.NavInitDefaultRequest || IMGUI_DEBUG_NAV;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NavMoveRequestCancel()
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
g.NavMoveRequest = false;
|
||||||
|
NavUpdateAnyRequestFlag();
|
||||||
|
}
|
||||||
|
|
||||||
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id)
|
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -2182,7 +2195,10 @@ static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGu
|
|||||||
{
|
{
|
||||||
// Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback
|
// Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback
|
||||||
if (!(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
if (!(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
||||||
|
{
|
||||||
g.NavInitDefaultRequest = g.NavInitDefaultResultExplicit = false; // Found a match, clear request
|
g.NavInitDefaultRequest = g.NavInitDefaultResultExplicit = false; // Found a match, clear request
|
||||||
|
NavUpdateAnyRequestFlag();
|
||||||
|
}
|
||||||
if (g.NavInitDefaultResultId == 0 || !(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
if (g.NavInitDefaultResultId == 0 || !(item_flags & ImGuiItemFlags_NoNavDefaultFocus))
|
||||||
{
|
{
|
||||||
g.NavInitDefaultResultId = id;
|
g.NavInitDefaultResultId = id;
|
||||||
@ -2235,7 +2251,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg)
|
|||||||
// We could early out with `if (is_clipped && !g.NavInitDefaultRequest) return false;` but when we wouldn't be able to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick)
|
// We could early out with `if (is_clipped && !g.NavInitDefaultRequest) return false;` but when we wouldn't be able to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick)
|
||||||
window->DC.NavLayerActiveMaskNext |= window->DC.NavLayerCurrentMask;
|
window->DC.NavLayerActiveMaskNext |= window->DC.NavLayerCurrentMask;
|
||||||
if (g.NavWindow == window->RootNavWindow)
|
if (g.NavWindow == window->RootNavWindow)
|
||||||
if (g.NavId == id || g.NavMoveRequest || g.NavInitDefaultRequest || IMGUI_DEBUG_NAV)
|
if (g.NavId == id || g.NavAnyRequest)
|
||||||
NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id);
|
NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2499,6 +2515,7 @@ static void NavInitWindow(ImGuiWindow* window, bool force_reinit)
|
|||||||
g.NavInitDefaultResultId = 0;
|
g.NavInitDefaultResultId = 0;
|
||||||
g.NavInitDefaultResultExplicit = false;
|
g.NavInitDefaultResultExplicit = false;
|
||||||
g.NavInitDefaultResultRectRel = ImRect();
|
g.NavInitDefaultResultRectRel = ImRect();
|
||||||
|
NavUpdateAnyRequestFlag();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2860,6 +2877,8 @@ static void NavUpdate()
|
|||||||
g.NavDisableHighlight = false;
|
g.NavDisableHighlight = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NavUpdateAnyRequestFlag();
|
||||||
|
|
||||||
// Scrolling
|
// Scrolling
|
||||||
if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget)
|
if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget)
|
||||||
{
|
{
|
||||||
@ -4237,6 +4256,7 @@ void ImGui::SetItemDefaultFocus()
|
|||||||
g.NavInitDefaultResultExplicit = true;
|
g.NavInitDefaultResultExplicit = true;
|
||||||
g.NavInitDefaultResultId = g.NavWindow->DC.LastItemId;
|
g.NavInitDefaultResultId = g.NavWindow->DC.LastItemId;
|
||||||
g.NavInitDefaultResultRectRel = ImRect(g.NavWindow->DC.LastItemRect.Min - g.NavWindow->Pos, g.NavWindow->DC.LastItemRect.Max - g.NavWindow->Pos);
|
g.NavInitDefaultResultRectRel = ImRect(g.NavWindow->DC.LastItemRect.Min - g.NavWindow->Pos, g.NavWindow->DC.LastItemRect.Max - g.NavWindow->Pos);
|
||||||
|
NavUpdateAnyRequestFlag();
|
||||||
if (!IsItemVisible())
|
if (!IsItemVisible())
|
||||||
SetScrollHere();
|
SetScrollHere();
|
||||||
}
|
}
|
||||||
@ -4511,8 +4531,8 @@ static void NavProcessMoveRequestWrapAround(ImGuiWindow* window)
|
|||||||
if (g.NavMoveRequest && g.NavWindow == window && g.NavMoveResultId == 0)
|
if (g.NavMoveRequest && g.NavWindow == window && g.NavMoveResultId == 0)
|
||||||
if ((g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) && g.NavMoveRequestForwardStep == 0 && g.NavLayer == 0)
|
if ((g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) && g.NavMoveRequestForwardStep == 0 && g.NavLayer == 0)
|
||||||
{
|
{
|
||||||
g.NavMoveRequest = false;
|
|
||||||
g.NavMoveRequestForwardStep = 1;
|
g.NavMoveRequestForwardStep = 1;
|
||||||
|
NavMoveRequestCancel();
|
||||||
g.NavWindow->NavRectRel[0].Min.y = g.NavWindow->NavRectRel[0].Max.y = (g.NavMoveDir == ImGuiDir_Up) ? window->SizeFull.y : 0.0f;
|
g.NavWindow->NavRectRel[0].Min.y = g.NavWindow->NavRectRel[0].Max.y = (g.NavMoveDir == ImGuiDir_Up) ? window->SizeFull.y : 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10123,8 +10143,8 @@ void ImGui::EndMenuBar()
|
|||||||
SetNavIdAndMoveMouse(window->NavLastIds[1], 1, window->NavRectRel[1]);
|
SetNavIdAndMoveMouse(window->NavLastIds[1], 1, window->NavRectRel[1]);
|
||||||
g.NavLayer = 1;
|
g.NavLayer = 1;
|
||||||
g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection.
|
g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection.
|
||||||
g.NavMoveRequest = false;
|
|
||||||
g.NavMoveRequestForwardStep = 1;
|
g.NavMoveRequestForwardStep = 1;
|
||||||
|
NavMoveRequestCancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,6 +480,7 @@ struct ImGuiContext
|
|||||||
bool NavMousePosDirty;
|
bool NavMousePosDirty;
|
||||||
bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (nb: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
|
bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (nb: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
|
||||||
bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
|
bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
|
||||||
|
bool NavAnyRequest; // ~~ NavMoveRequest || NavInitDefaultRequest
|
||||||
bool NavInitDefaultRequest; // Init request for appearing window to select first item
|
bool NavInitDefaultRequest; // Init request for appearing window to select first item
|
||||||
ImGuiID NavInitDefaultResultId;
|
ImGuiID NavInitDefaultResultId;
|
||||||
ImRect NavInitDefaultResultRectRel;
|
ImRect NavInitDefaultResultRectRel;
|
||||||
@ -596,6 +597,7 @@ struct ImGuiContext
|
|||||||
NavMousePosDirty = false;
|
NavMousePosDirty = false;
|
||||||
NavDisableHighlight = true;
|
NavDisableHighlight = true;
|
||||||
NavDisableMouseHover = false;
|
NavDisableMouseHover = false;
|
||||||
|
NavAnyRequest = false;
|
||||||
NavInitDefaultRequest = false;
|
NavInitDefaultRequest = false;
|
||||||
NavInitDefaultResultId = 0;
|
NavInitDefaultResultId = 0;
|
||||||
NavInitDefaultResultExplicit = false;
|
NavInitDefaultResultExplicit = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user