From 3c611980431eeb78c37ebc6fc33e76d99e5e97c6 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Fri, 10 Nov 2017 23:53:27 +0700 Subject: [PATCH] Hardcode blend mode, which is impossible to emulate with shaders. Fixed Tony Hawk's Pro Skater 2 Shadow Glitch #1337 --- .../GLSL/glsl_CombinerProgramUniformFactory.cpp | 6 ++++++ src/GraphicsDrawer.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp index b1710152..6e5a8740 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactory.cpp @@ -306,6 +306,12 @@ public: void update(bool _force) override { + if ((gDP.otherMode.l & 0xFFFF0000) == 0x01500000) { + uForceBlendCycle1.set(0, _force); + uForceBlendCycle2.set(0, _force); + return; + } + uBlendMux1.set(gDP.otherMode.c1_m1a, gDP.otherMode.c1_m1b, gDP.otherMode.c1_m2a, diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp index c48ecc59..1a1cb53e 100644 --- a/src/GraphicsDrawer.cpp +++ b/src/GraphicsDrawer.cpp @@ -441,6 +441,17 @@ void GraphicsDrawer::_setBlendMode() const return; } + if ((gDP.otherMode.l & 0xFFFF0000) == 0x01500000) { + // clr_in * a_in + clr_mem * (1-a) + // clr_in * a_fog + clr_mem * (1-a) + // impossible to emulate + if (gDP.otherMode.forceBlender != 0 && gDP.otherMode.cycleType < G_CYC_COPY) { + gfxContext.enable(enable::BLEND, true); + gfxContext.setBlending(blend::SRC_ALPHA, blend::ONE_MINUS_SRC_ALPHA); + return; + } + } + if (gDP.otherMode.forceBlender != 0 && gDP.otherMode.cycleType < G_CYC_COPY) { BlendParam srcFactor = blend::ONE; BlendParam dstFactor = blend::ZERO;