diff --git a/src/xenia/ui/gl/gl_immediate_drawer.cc b/src/xenia/ui/gl/gl_immediate_drawer.cc index 9cbdaf037..42d9293fd 100644 --- a/src/xenia/ui/gl/gl_immediate_drawer.cc +++ b/src/xenia/ui/gl/gl_immediate_drawer.cc @@ -270,6 +270,16 @@ void GLImmediateDrawer::End() { } } +void GLImmediateDrawer::EnableAlphaTest(bool enable) { + if (enable) { + glEnablei(GL_BLEND, 0); + glBlendEquationi(0, GL_FUNC_ADD); + glBlendFunci(0, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } else { + glDisablei(GL_BLEND, 0); + } +} + } // namespace gl } // namespace ui } // namespace xe diff --git a/src/xenia/ui/gl/gl_immediate_drawer.h b/src/xenia/ui/gl/gl_immediate_drawer.h index e9e02798e..cf0ed1603 100644 --- a/src/xenia/ui/gl/gl_immediate_drawer.h +++ b/src/xenia/ui/gl/gl_immediate_drawer.h @@ -37,6 +37,8 @@ class GLImmediateDrawer : public ImmediateDrawer { void EndDrawBatch() override; void End() override; + void EnableAlphaTest(bool enable); + private: void InitializeShaders(); diff --git a/src/xenia/ui/imgui_drawer.cc b/src/xenia/ui/imgui_drawer.cc index 6507699e7..7be42804b 100644 --- a/src/xenia/ui/imgui_drawer.cc +++ b/src/xenia/ui/imgui_drawer.cc @@ -203,11 +203,16 @@ void ImGuiDrawer::RenderDrawLists(ImDrawData* data) { for (int j = 0; j < cmd_list->CmdBuffer.size(); ++j) { const auto& cmd = cmd_list->CmdBuffer[j]; + if (reinterpret_cast(cmd.TextureId) & kIgnoreAlpha) { + drawer->EnableAlphaTest(false); + } + ImmediateDraw draw; draw.primitive_type = ImmediatePrimitiveType::kTriangles; draw.count = cmd.ElemCount; draw.index_offset = index_offset; - draw.texture_handle = reinterpret_cast(cmd.TextureId); + draw.texture_handle = + reinterpret_cast(cmd.TextureId) & 0xFFFFFFFF; draw.scissor = true; draw.scissor_rect[0] = static_cast(cmd.ClipRect.x); draw.scissor_rect[1] = static_cast(height - cmd.ClipRect.w); @@ -215,6 +220,10 @@ void ImGuiDrawer::RenderDrawLists(ImDrawData* data) { draw.scissor_rect[3] = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); drawer->Draw(draw); + if (reinterpret_cast(cmd.TextureId) & kIgnoreAlpha) { + drawer->EnableAlphaTest(true); + } + index_offset += cmd.ElemCount; } diff --git a/src/xenia/ui/imgui_drawer.h b/src/xenia/ui/imgui_drawer.h index 2bbfb0a99..f6a58f8f0 100644 --- a/src/xenia/ui/imgui_drawer.h +++ b/src/xenia/ui/imgui_drawer.h @@ -35,6 +35,8 @@ class ImGuiDrawer : public WindowListener { ImGuiIO& GetIO(); + static const uint64_t kIgnoreAlpha = (1ull << 32); + protected: void Initialize(); void SetupFont(); diff --git a/src/xenia/ui/immediate_drawer.h b/src/xenia/ui/immediate_drawer.h index 3b7f01238..1c064d91b 100644 --- a/src/xenia/ui/immediate_drawer.h +++ b/src/xenia/ui/immediate_drawer.h @@ -113,6 +113,8 @@ class ImmediateDrawer { // Ends drawing in immediate mode and flushes contents. virtual void End() = 0; + virtual void EnableAlphaTest(bool enable) = 0; + protected: ImmediateDrawer(GraphicsContext* graphics_context) : graphics_context_(graphics_context) {}