ImDrawList merging commands with same texture

This commit is contained in:
ocornut 2015-01-17 14:13:08 +00:00
parent 3e30ad3802
commit edee014ab8

View file

@ -1688,7 +1688,7 @@ void ImGui::Shutdown()
g.Settings.clear(); g.Settings.clear();
g.ColorModifiers.clear(); g.ColorModifiers.clear();
g.StyleModifiers.clear(); g.StyleModifiers.clear();
g.FontStack.clear(); g.FontStack.clear();
g.ColorEditModeStorage.Clear(); g.ColorEditModeStorage.Clear();
if (g.LogFile && g.LogFile != stdout) if (g.LogFile && g.LogFile != stdout)
{ {
@ -2812,16 +2812,16 @@ void ImGui::PushFont(ImFont* font)
{ {
ImGuiState& g = GImGui; ImGuiState& g = GImGui;
SetFont(font); SetFont(font);
g.FontStack.push_back(font); g.FontStack.push_back(font);
g.CurrentWindow->DrawList->PushTextureID(font->TexID); g.CurrentWindow->DrawList->PushTextureID(font->TexID);
} }
void ImGui::PopFont() void ImGui::PopFont()
{ {
ImGuiState& g = GImGui; ImGuiState& g = GImGui;
g.CurrentWindow->DrawList->PopTextureID(); g.CurrentWindow->DrawList->PopTextureID();
g.FontStack.pop_back(); g.FontStack.pop_back();
SetFont(g.FontStack.empty() ? g.IO.Font : g.FontStack.back()); SetFont(g.FontStack.empty() ? g.IO.Font : g.FontStack.back());
} }
@ -5928,11 +5928,12 @@ void ImDrawList::Clear()
void ImDrawList::SetClipRect(const ImVec4& clip_rect) void ImDrawList::SetClipRect(const ImVec4& clip_rect)
{ {
if (!commands.empty() && commands.back().vtx_count == 0) ImDrawCmd* current_cmd = commands.empty() ? NULL : &commands.back();
if (current_cmd && current_cmd->vtx_count == 0)
{ {
// Reuse existing command (high-level clipping may have discarded vertices submitted earlier) // Reuse existing command (high-level clipping may have discarded vertices submitted earlier)
// FIXME-OPT: Possibly even reuse previous command. // FIXME-OPT: Possibly even reuse previous command.
commands.back().clip_rect = clip_rect; current_cmd->clip_rect = clip_rect;
} }
else else
{ {
@ -5959,11 +5960,12 @@ void ImDrawList::PopClipRect()
void ImDrawList::SetTextureID(const ImTextureID& texture_id) void ImDrawList::SetTextureID(const ImTextureID& texture_id)
{ {
if (!commands.empty() && commands.back().vtx_count == 0) ImDrawCmd* current_cmd = commands.empty() ? NULL : &commands.back();
if (current_cmd && (current_cmd->vtx_count == 0 || current_cmd->texture_id == texture_id))
{ {
// Reuse existing command (high-level clipping may have discarded vertices submitted earlier) // Reuse existing command
// FIXME-OPT: Possibly even reuse previous command. // FIXME-OPT: Possibly even reuse previous command.
commands.back().texture_id = texture_id; current_cmd->texture_id = texture_id;
} }
else else
{ {