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:
parent
16e500fd92
commit
3c9cdf5694
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
15
Shaders.h
15
Shaders.h
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user