1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Add special blend mode for Donald Duck background.

This commit is contained in:
Sergey Lipskiy 2014-12-25 16:48:04 +06:00
parent 16e500fd92
commit 3c9cdf5694
3 changed files with 42 additions and 20 deletions

View File

@ -401,18 +401,17 @@ ShaderCombiner::ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCo
{
strFragmentShader.assign(fragment_shader_header_common_variables);
char strCombiner[512];
strcpy(strCombiner, " alpha1 = ");
if (gDP.otherMode.cycleType == G_CYC_1CYCLE)
if (gDP.otherMode.cycleType == G_CYC_1CYCLE) {
CorrectFirstStageParams(_alpha.stage[0]);
CorrectFirstStageParams(_color.stage[0]);
}
char strCombiner[1024];
strcpy(strCombiner, " alpha1 = ");
m_nInputs = CompileCombiner(_alpha.stage[0], AlphaInput, strCombiner);
strcat(strCombiner, " color1 = ");
if (gDP.otherMode.cycleType == G_CYC_1CYCLE)
CorrectFirstStageParams(_color.stage[0]);
m_nInputs |= CompileCombiner(_color.stage[0], ColorInput, strCombiner);
// Hack For Mace
strcat(strCombiner, " if (uUseBlendColor != 0) color1 = color1 * alpha1 + uBlendColor.rgb * (1.0 - alpha1); \n");
if (gDP.otherMode.cycleType == G_CYC_2CYCLE)
strcat(strCombiner, fragment_shader_blender);
strcat(strCombiner, " combined_color = vec4(color1, alpha1); \n");
if (_alpha.numStages == 2) {
@ -568,7 +567,7 @@ void ShaderCombiner::_locateUniforms() {
LocateUniform(uMaxTile)
LocateUniform(uTextureDetail);
LocateUniform(uTexturePersp);
LocateUniform(uUseBlendColor);
LocateUniform(uSpecialBlendMode);
LocateUniform(uFogMultiplier);
LocateUniform(uFogOffset);
@ -663,9 +662,11 @@ void ShaderCombiner::updateColors(bool _bForce)
_setV4Uniform(m_uniforms.uPrimColor, &gDP.primColor.r, _bForce);
_setV4Uniform(m_uniforms.uScaleColor, &gDP.key.scale.r, _bForce);
_setV4Uniform(m_uniforms.uCenterColor, &gDP.key.center.r, _bForce);
const u32 blender = (gDP.otherMode.l >> 16);
const int nFogBlendEnabled = (gDP.otherMode.c1_m1a == 3 || gDP.otherMode.c1_m2a == 3 || gDP.otherMode.c2_m1a == 3 || gDP.otherMode.c2_m2a == 3) ? 256 : 0;
int nFogUsage;
int nFogUsage = (config.enableFog != 0 && (gSP.geometryMode & G_FOG) != 0) ? 1 : 0;
int nSpecialBlendMode = 0;
switch (blender) {
case 0x0150:
case 0x0D18:
@ -677,22 +678,27 @@ void ShaderCombiner::updateColors(bool _bForce)
case 0xC912:
nFogUsage = 2;
break;
case 0x0550:
nFogUsage = 4;
break;
case 0xF550:
nFogUsage = 3;
break;
case 0x0550:
nFogUsage = 4;
break;
case 0x0382:
case 0x0091:
_setIUniform(m_uniforms.uUseBlendColor, 1, _bForce);
// Mace
// CLR_IN * A_IN + CLR_BL * 1MA
nSpecialBlendMode = 1;
_setV4Uniform(m_uniforms.uBlendColor, &gDP.blendColor.r, _bForce);
nFogUsage = (config.enableFog != 0 && (gSP.geometryMode & G_FOG) != 0) ? 1 : 0;
break;
default:
_setIUniform(m_uniforms.uUseBlendColor, 0, _bForce);
nFogUsage = (config.enableFog != 0 && (gSP.geometryMode & G_FOG) != 0) ? 1 : 0;
case 0xc702:
// Donald Duck
// clr_fog*a_fog + clr_in*1ma
nFogUsage = 5;
nSpecialBlendMode = 2;
break;
}
int nFogMode = 0; // Normal
if (nFogUsage == 0) {
switch (blender) {
@ -708,6 +714,8 @@ void ShaderCombiner::updateColors(bool _bForce)
break;
}
}
_setIUniform(m_uniforms.uSpecialBlendMode, nSpecialBlendMode, _bForce);
_setIUniform(m_uniforms.uFogUsage, nFogUsage | nFogBlendEnabled, _bForce);
_setIUniform(m_uniforms.uFogMode, nFogMode, _bForce);
if (nFogUsage + nFogMode != 0) {
@ -715,6 +723,7 @@ void ShaderCombiner::updateColors(bool _bForce)
_setFUniform(m_uniforms.uFogOffset, (float)gSP.fog.offset / 256.0f, _bForce);
_setV4Uniform(m_uniforms.uFogColor, &gDP.fogColor.r, _bForce);
}
_setFUniform(m_uniforms.uK4, gDP.convert.k4*0.0039215689f, _bForce);
_setFUniform(m_uniforms.uK5, gDP.convert.k5*0.0039215689f, _bForce);

View File

@ -38,7 +38,7 @@ private:
iUniform uTex0, uTex1, uTlutImage, uZlutImage, uDepthImage,
uFogMode, uFogUsage, uEnableLod, uEnableAlphaTest,
uEnableDepth, uEnableDepthCompare, uEnableDepthUpdate,
uDepthMode, uFb8Bit, uFbFixedAlpha, uRenderState, uUseBlendColor,
uDepthMode, uFb8Bit, uFbFixedAlpha, uRenderState, uSpecialBlendMode,
uMaxTile, uTextureDetail, uTexturePersp,
uAlphaCompareMode, uAlphaDitherMode, uColorDitherMode, uGammaCorrectionEnabled;

View File

@ -147,7 +147,7 @@ static const char* fragment_shader_header_common_variables =
"uniform lowp int uFogUsage; \n"
"uniform lowp int uFb8Bit; \n"
"uniform lowp int uFbFixedAlpha;\n"
"uniform lowp int uUseBlendColor;\n"
"uniform lowp int uSpecialBlendMode;\n"
"in lowp vec4 vShadeColor; \n"
"in mediump vec2 vTexCoord0;\n"
"in mediump vec2 vTexCoord1;\n"
@ -343,6 +343,19 @@ static const char* fragment_shader_readtex1color =
" if (uFbFixedAlpha == 2 || uFbFixedAlpha == 3) readtex1.a = 0.825; \n"
;
static const char* fragment_shader_blender =
" switch (uSpecialBlendMode) { \n"
" case 1: \n"
// Mace
" color1 = color1 * alpha1 + uBlendColor.rgb * (1.0 - alpha1); \n"
" break; \n"
// Donald Duck
" case 2: \n"
" color1 = uFogColor.rgb*uFogColor.a + color1*(1.0-alpha1);\n"
" break; \n"
" } \n"
;
static const char* fragment_shader_end =
"} \n"
#else