123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #version 110
- uniform sampler2D tex;
- uniform int style;
- uniform float bodyColorSaturation;
- uniform float bodyAlphaMultiplier;
- uniform float borderSizeMultiplier;
- uniform float borderFeather;
- uniform vec3 colBorder;
- uniform vec3 colBody;
- varying vec2 tex_coord;
- const float defaultTransitionSize = 0.011;
- const float defaultBorderSize = 0.11;
- const float outerShadowSize = 0.08;
- vec4 getInnerBodyColor(in vec4 bodyColor)
- {
- float brightnessMultiplier = 0.25;
- bodyColor.r = min(1.0, bodyColor.r * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
- bodyColor.g = min(1.0, bodyColor.g * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
- bodyColor.b = min(1.0, bodyColor.b * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
- return vec4(bodyColor);
- }
- vec4 getOuterBodyColor(in vec4 bodyColor)
- {
- float darknessMultiplier = 0.1;
- bodyColor.r = min(1.0, bodyColor.r / (1.0 + darknessMultiplier));
- bodyColor.g = min(1.0, bodyColor.g / (1.0 + darknessMultiplier));
- bodyColor.b = min(1.0, bodyColor.b / (1.0 + darknessMultiplier));
- return vec4(bodyColor);
- }
- void main()
- {
- float borderSize = (defaultBorderSize + borderFeather) * borderSizeMultiplier;
- float transitionSize = defaultTransitionSize + borderFeather;
- // output var
- vec4 out_color = vec4(0.0);
-
- // dynamic color calculations
- vec4 borderColor = vec4(colBorder.x, colBorder.y, colBorder.z, 1.0);
- vec4 bodyColor = vec4(colBody.x, colBody.y, colBody.z, 0.7*bodyAlphaMultiplier);
- vec4 outerShadowColor = vec4(0, 0, 0, 0.25);
- vec4 innerBodyColor = getInnerBodyColor(bodyColor);
- vec4 outerBodyColor = getOuterBodyColor(bodyColor);
-
- innerBodyColor.rgb *= bodyColorSaturation;
- outerBodyColor.rgb *= bodyColorSaturation;
-
- // osu!next style color modifications
- if (style == 1)
- {
- outerBodyColor.rgb = bodyColor.rgb * bodyColorSaturation;
- outerBodyColor.a = 1.0*bodyAlphaMultiplier;
- innerBodyColor.rgb = bodyColor.rgb * 0.5 * bodyColorSaturation;
- innerBodyColor.a = 0.0;
- }
-
- // a bit of a hack, but better than rough edges
- if (borderSizeMultiplier < 0.01)
- borderColor = outerShadowColor;
-
- // conditional variant
-
- if (tex_coord.x < outerShadowSize - transitionSize) // just shadow
- {
- float delta = tex_coord.x / (outerShadowSize - transitionSize);
- out_color = mix(vec4(0), outerShadowColor, delta);
- }
- if (tex_coord.x > outerShadowSize - transitionSize && tex_coord.x < outerShadowSize + transitionSize) // shadow + border
- {
- float delta = (tex_coord.x - outerShadowSize + transitionSize) / (2.0*transitionSize);
- out_color = mix(outerShadowColor, borderColor, delta);
- }
- if (tex_coord.x > outerShadowSize + transitionSize && tex_coord.x < outerShadowSize + borderSize - transitionSize) // just border
- {
- out_color = borderColor;
- }
- if (tex_coord.x > outerShadowSize + borderSize - transitionSize && tex_coord.x < outerShadowSize + borderSize + transitionSize) // border + outer body
- {
- float delta = (tex_coord.x - outerShadowSize - borderSize + transitionSize) / (2.0*transitionSize);
- out_color = mix(borderColor, outerBodyColor, delta);
- }
- if (tex_coord.x > outerShadowSize + borderSize + transitionSize) // outer body + inner body
- {
- float size = outerShadowSize + borderSize + transitionSize;
- float delta = ((tex_coord.x - size) / (1.0-size));
- out_color = mix(outerBodyColor, innerBodyColor, delta);
- }
-
- // linear variant
- /*
- // just shadow
- float delta = tex_coord.x/(outerShadowSize-transitionSize);
- out_color += mix(vec4(0.0), outerShadowColor, delta) * clamp(ceil(-delta+1.0), 0.0, 1.0);
-
- // shadow + border
- delta = (tex_coord.x - outerShadowSize + transitionSize) / (2.0*transitionSize);
- out_color += mix(outerShadowColor, borderColor, delta) * clamp(ceil(tex_coord.x - (outerShadowSize - transitionSize)), 0.0, 1.0) * clamp(ceil(-abs(delta)+1.0), 0.0, 1.0);
-
- // just border
- out_color += borderColor * clamp(ceil(tex_coord.x - (outerShadowSize + transitionSize)), 0.0, 1.0) * clamp(ceil(-(tex_coord.x - (outerShadowSize + borderSize - transitionSize))), 0.0, 1.0);
-
- // border + outer body
- delta = (tex_coord.x - outerShadowSize - borderSize + transitionSize) / (2.0*transitionSize);
- out_color += mix(borderColor, outerBodyColor, delta) * clamp(ceil(tex_coord.x - (outerShadowSize + borderSize - transitionSize)), 0.0, 1.0) * clamp(ceil(-abs(delta)+1.0), 0.0, 1.0);
-
- // outer body + inner body
- delta = outerShadowSize + borderSize + transitionSize;
- delta = (tex_coord.x - delta) / (1.0-delta); // [VARIABLE REUSING INTENSIFIES]
- out_color += mix(outerBodyColor, innerBodyColor, delta) * clamp(ceil(tex_coord.x - (outerShadowSize + borderSize + transitionSize)), 0.0, 1.0);
- */
-
- gl_FragColor = out_color;
- }
|