From f89054baad446b861e708d8f7391b8dbcb40a08a Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:00:47 -0400 Subject: [PATCH] [graphics] add missing blend used in final boss fight (#1406) --- game/graphics/opengl_renderer/foreground/Generic2.h | 4 ++-- .../opengl_renderer/foreground/Generic2_Build.cpp | 8 +++++--- .../opengl_renderer/foreground/Generic2_OpenGL.cpp | 12 ++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/game/graphics/opengl_renderer/foreground/Generic2.h b/game/graphics/opengl_renderer/foreground/Generic2.h index 244f062995..8d1fc8c41e 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2.h +++ b/game/graphics/opengl_renderer/foreground/Generic2.h @@ -184,8 +184,8 @@ class Generic2 : public BucketRenderer { u32 dma_tags = 0; } m_stats; - static constexpr int ALPHA_MODE_COUNT = 6; - bool m_alpha_draw_enable[ALPHA_MODE_COUNT] = {true, true, true, true, true, true}; + static constexpr int ALPHA_MODE_COUNT = 7; + bool m_alpha_draw_enable[ALPHA_MODE_COUNT] = {true, true, true, true, true, true, true}; struct { GLuint vao; diff --git a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp index 40562ce92a..6814b6d19d 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp @@ -155,10 +155,12 @@ void Generic2::determine_draw_modes() { } else if (a == GsAlpha::BlendMode::SOURCE && b == GsAlpha::BlendMode::ZERO_OR_FIXED && c == GsAlpha::BlendMode::DEST && d == GsAlpha::BlendMode::DEST) { current_mode.set_alpha_blend(DrawMode::AlphaBlend::SRC_0_DST_DST); + } else if (a == GsAlpha::BlendMode::SOURCE && b == GsAlpha::BlendMode::ZERO_OR_FIXED && + c == GsAlpha::BlendMode::ZERO_OR_FIXED && d == GsAlpha::BlendMode::DEST) { + current_mode.set_alpha_blend(DrawMode::AlphaBlend::SRC_0_FIX_DST); } else { - // unsupported blend: a 0 b 2 c 2 d 1 - // lg::error("unsupported blend: a {} b {} c {} d {}", (int)a, (int)b, (int)c, (int)d); - // ASSERT(false); + fmt::print("unsupported blend: a {} b {} c {} d {}\n", (int)a, (int)b, (int)c, (int)d); + // ASSERT(false); } } } diff --git a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp index d7536dbc45..21382011fe 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp @@ -152,7 +152,10 @@ void Generic2::setup_opengl_for_draw_mode(const DrawMode& draw_mode, // (Cs - 0) * Ad + Cd glBlendFunc(GL_DST_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); - color_mult = 0.5f; // HACK, should probably be 0.5 + color_mult = 0.5f; + } else if (draw_mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_0_FIX_DST) { + glBlendEquation(GL_FUNC_ADD); + glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ZERO); } else { ASSERT(false); } @@ -296,9 +299,10 @@ void Generic2::do_draws(SharedRenderState* render_state, ScopedProfilerNode& pro opengl_bind_and_setup_proj(render_state); constexpr DrawMode::AlphaBlend alpha_order[ALPHA_MODE_COUNT] = { - DrawMode::AlphaBlend::SRC_SRC_SRC_SRC, DrawMode::AlphaBlend::SRC_DST_SRC_DST, - DrawMode::AlphaBlend::SRC_0_SRC_DST, DrawMode::AlphaBlend::ZERO_SRC_SRC_DST, - DrawMode::AlphaBlend::SRC_DST_FIX_DST, DrawMode::AlphaBlend::SRC_0_DST_DST, + DrawMode::AlphaBlend::SRC_0_FIX_DST, DrawMode::AlphaBlend::SRC_SRC_SRC_SRC, + DrawMode::AlphaBlend::SRC_DST_SRC_DST, DrawMode::AlphaBlend::SRC_0_SRC_DST, + DrawMode::AlphaBlend::ZERO_SRC_SRC_DST, DrawMode::AlphaBlend::SRC_DST_FIX_DST, + DrawMode::AlphaBlend::SRC_0_DST_DST, }; for (int i = 0; i < ALPHA_MODE_COUNT; i++) {