GameUI: light console code cleanup and optimizations

Use static functions instead of an std::function for stuff that could've easily been a static or inline. This imposes less overhead to the runtime.
This commit is contained in:
Kawe Mazidjatari 2024-11-23 01:09:21 +01:00
parent e05d137acd
commit 7febdde3d4
2 changed files with 134 additions and 119 deletions

View File

@ -406,6 +406,110 @@ void CConsole::DrawOptionsPanel(void)
ImGui::EndPopup();
}
//-----------------------------------------------------------------------------
// Purpose: returns flag texture index for CommandBase (must be aligned with resource.h!)
// in the future we should build the texture procedurally with use of popcnt.
// Input : nFlags -
//-----------------------------------------------------------------------------
static int GetFlagTextureIndex(const int flags)
{
switch (flags) // All indices for single/dual flag textures.
{
case FCVAR_DEVELOPMENTONLY:
return 9;
case FCVAR_GAMEDLL:
return 10;
case FCVAR_CLIENTDLL:
return 11;
case FCVAR_REPLICATED:
return 12;
case FCVAR_CHEAT:
return 13;
case FCVAR_RELEASE:
return 14;
case FCVAR_MATERIAL_SYSTEM_THREAD:
return 15;
case FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL:
return 16;
case FCVAR_DEVELOPMENTONLY | FCVAR_CLIENTDLL:
return 17;
case FCVAR_DEVELOPMENTONLY | FCVAR_REPLICATED:
return 18;
case FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT:
return 19;
case FCVAR_DEVELOPMENTONLY | FCVAR_MATERIAL_SYSTEM_THREAD:
return 20;
case FCVAR_REPLICATED | FCVAR_CHEAT:
return 21;
case FCVAR_REPLICATED | FCVAR_RELEASE:
return 22;
case FCVAR_GAMEDLL | FCVAR_CHEAT:
return 23;
case FCVAR_GAMEDLL | FCVAR_RELEASE:
return 24;
case FCVAR_CLIENTDLL | FCVAR_CHEAT:
return 25;
case FCVAR_CLIENTDLL | FCVAR_RELEASE:
return 26;
case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_CHEAT:
return 27;
case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_RELEASE:
return 28;
case COMMAND_COMPLETION_MARKER:
return 29;
default: // Hit when flag is zero/non-indexed or 3+ bits are set.
const unsigned int v = __popcnt(flags);
switch (v)
{
case 0:
return 0; // Pink checker texture (FCVAR_NONE)
case 1:
return 1; // Yellow checker texture (non-indexed).
default:
// If 3 or more bits are set, we test the flags
// and display the appropriate checker texture.
const bool mul = v > 2;
if (flags & FCVAR_DEVELOPMENTONLY)
{
return mul ? 4 : 3;
}
else if (flags & FCVAR_CHEAT)
{
return mul ? 6 : 5;
}
else if (flags & FCVAR_RELEASE && // RELEASE command but no context restriction.
!(flags & FCVAR_SERVER_CAN_EXECUTE) &&
!(flags & FCVAR_CLIENTCMD_CAN_EXECUTE))
{
return mul ? 8 : 7;
}
// Rainbow checker texture (user needs to manually check flags).
// These commands are not restricted if ran from the same context.
return 2;
}
}
}
//-----------------------------------------------------------------------------
// Purpose: adds an icon hint to the suggest panel
// Input : &cvarInfo -
// &flagIconHandles -
//-----------------------------------------------------------------------------
static void AddHint(const ConVarFlags::FlagDesc_t& cvarInfo, const vector<MODULERESOURCE>& flagIconHandles)
{
const int hintTexIdx = GetFlagTextureIndex(cvarInfo.bit);
const MODULERESOURCE& hintRes = flagIconHandles[hintTexIdx];
ImGui::Image(hintRes.m_idIcon, ImVec2(float(hintRes.m_nWidth), float(hintRes.m_nHeight)));
ImGui::SameLine();
ImGui::Text("%s", cvarInfo.shortdesc);
};
//-----------------------------------------------------------------------------
// Purpose: draws the autocomplete panel with results based on user input
//-----------------------------------------------------------------------------
@ -450,16 +554,6 @@ void CConsole::DrawAutoCompletePanel(void)
if (ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly) &&
suggest.flags != COMMAND_COMPLETION_MARKER)
{
const std::function<void(const ConVarFlags::FlagDesc_t&)> fnAddHint = [&](const ConVarFlags::FlagDesc_t& cvarInfo)
{
const int hintTexIdx = GetFlagTextureIndex(cvarInfo.bit);
const MODULERESOURCE& hintRes = m_vecFlagIcons[hintTexIdx];
ImGui::Image(hintRes.m_idIcon, ImVec2(float(hintRes.m_nWidth), float(hintRes.m_nHeight)));
ImGui::SameLine();
ImGui::Text("%s", cvarInfo.shortdesc);
};
ImGui::BeginTooltip();
bool isFlagSet = false;
@ -470,12 +564,12 @@ void CConsole::DrawAutoCompletePanel(void)
if (suggest.flags & info.bit)
{
isFlagSet = true;
fnAddHint(info);
AddHint(info, m_vecFlagIcons);
}
}
if (!isFlagSet) // Display the FCVAR_NONE flag if no flags are set.
{
fnAddHint(g_ConVarFlags.m_FlagsToDesc[0]);
AddHint(g_ConVarFlags.m_FlagsToDesc[0], m_vecFlagIcons);
}
ImGui::EndTooltip();
@ -623,6 +717,29 @@ void CConsole::ResetAutoCompleteData(void)
m_vecSuggest.clear();
}
//-----------------------------------------------------------------------------
// Purpose: format appends the value string
//-----------------------------------------------------------------------------
static void AppendValueString(string& targetString, const char* const toAppend)
{
targetString.append(" = ["); // Assign current value to string if its a ConVar.
targetString.append(toAppend);
targetString.append("]");
}
//-----------------------------------------------------------------------------
// Purpose: format appends the doc string
//-----------------------------------------------------------------------------
static void AppendDocString(string& targetString, const char* const toAppend)
{
if (VALID_CHARSTAR(toAppend))
{
targetString.append(" - \"");
targetString.append(toAppend);
targetString.append("\"");
}
}
//-----------------------------------------------------------------------------
// Purpose: find ConVars/ConCommands from user input and add to vector
// - Ignores ConVars marked FCVAR_HIDDEN
@ -658,28 +775,16 @@ void CConsole::CreateSuggestionsFromPartial(void)
{
string docString;
// Assign current value to string if its a ConVar.
if (!commandBase->IsCommand())
{
const ConVar* conVar = reinterpret_cast<const ConVar*>(commandBase);
docString = " = ["; // Assign current value to string if its a ConVar.
docString.append(conVar->GetString());
docString.append("]");
const ConVar* const conVar = reinterpret_cast<const ConVar*>(commandBase);
AppendValueString(docString, conVar->GetString());
}
if (con_suggest_helptext.GetBool())
{
std::function<void(string& , const char*)> fnAppendDocString = [&](string& targetString, const char* toAppend)
{
if (VALID_CHARSTAR(toAppend))
{
targetString.append(" - \"");
targetString.append(toAppend);
targetString.append("\"");
}
};
fnAppendDocString(docString, commandBase->GetHelpText());
fnAppendDocString(docString, commandBase->GetUsageText());
AppendDocString(docString, commandBase->GetHelpText());
AppendDocString(docString, commandBase->GetUsageText());
}
m_vecSuggest.push_back(ConAutoCompleteSuggest_s(commandName + docString, commandBase->GetFlags()));
}
@ -828,95 +933,6 @@ bool CConsole::LoadFlagIcons(void)
return ret;
}
//-----------------------------------------------------------------------------
// Purpose: returns flag texture index for CommandBase (must be aligned with resource.h!)
// in the future we should build the texture procedurally with use of popcnt.
// Input : nFlags -
//-----------------------------------------------------------------------------
int CConsole::GetFlagTextureIndex(const int flags) const
{
switch (flags) // All indices for single/dual flag textures.
{
case FCVAR_DEVELOPMENTONLY:
return 9;
case FCVAR_GAMEDLL:
return 10;
case FCVAR_CLIENTDLL:
return 11;
case FCVAR_REPLICATED:
return 12;
case FCVAR_CHEAT:
return 13;
case FCVAR_RELEASE:
return 14;
case FCVAR_MATERIAL_SYSTEM_THREAD:
return 15;
case FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL:
return 16;
case FCVAR_DEVELOPMENTONLY | FCVAR_CLIENTDLL:
return 17;
case FCVAR_DEVELOPMENTONLY | FCVAR_REPLICATED:
return 18;
case FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT:
return 19;
case FCVAR_DEVELOPMENTONLY | FCVAR_MATERIAL_SYSTEM_THREAD:
return 20;
case FCVAR_REPLICATED | FCVAR_CHEAT:
return 21;
case FCVAR_REPLICATED | FCVAR_RELEASE:
return 22;
case FCVAR_GAMEDLL | FCVAR_CHEAT:
return 23;
case FCVAR_GAMEDLL | FCVAR_RELEASE:
return 24;
case FCVAR_CLIENTDLL | FCVAR_CHEAT:
return 25;
case FCVAR_CLIENTDLL | FCVAR_RELEASE:
return 26;
case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_CHEAT:
return 27;
case FCVAR_MATERIAL_SYSTEM_THREAD | FCVAR_RELEASE:
return 28;
case COMMAND_COMPLETION_MARKER:
return 29;
default: // Hit when flag is zero/non-indexed or 3+ bits are set.
const unsigned int v = __popcnt(flags);
switch (v)
{
case 0:
return 0; // Pink checker texture (FCVAR_NONE)
case 1:
return 1; // Yellow checker texture (non-indexed).
default:
// If 3 or more bits are set, we test the flags
// and display the appropriate checker texture.
bool mul = v > 2;
if (flags & FCVAR_DEVELOPMENTONLY)
{
return mul ? 4 : 3;
}
else if (flags & FCVAR_CHEAT)
{
return mul ? 6 : 5;
}
else if (flags & FCVAR_RELEASE && // RELEASE command but no context restriction.
!(flags & FCVAR_SERVER_CAN_EXECUTE) &&
!(flags & FCVAR_CLIENTCMD_CAN_EXECUTE))
{
return mul ? 8 : 7;
}
// Rainbow checker texture (user needs to manually check flags).
// These commands are not restricted if ran from the same context.
return 2;
}
}
}
//-----------------------------------------------------------------------------
// Purpose: console input box callback
// Input : *iData -

View File

@ -37,7 +37,6 @@ private:
void DetermineAutoCompleteWindowRect(void);
bool LoadFlagIcons(void);
int GetFlagTextureIndex(const int flags) const;
int TextEditCallback(ImGuiInputTextCallbackData* pData);
static int TextEditCallbackStub(ImGuiInputTextCallbackData* pData);