sliderVR.fsh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #version 110
  2. uniform sampler2D tex;
  3. uniform int part;
  4. uniform int style;
  5. uniform float bodyColorSaturation;
  6. uniform float bodyAlphaMultiplier;
  7. uniform float borderSizeMultiplier;
  8. uniform vec3 colBorder;
  9. uniform vec3 colBody;
  10. varying vec2 tex_coord;
  11. const float defaultTransitionSize = 0.011;
  12. const float defaultBorderSize = 0.11;
  13. const float defaultOuterShadowSize = 0.08;
  14. vec4 getInnerBodyColor(in vec4 bodyColor)
  15. {
  16. float brightnessMultiplier = 0.25;
  17. bodyColor.r = min(1.0, bodyColor.r * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
  18. bodyColor.g = min(1.0, bodyColor.g * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
  19. bodyColor.b = min(1.0, bodyColor.b * (1.0 + 0.5 * brightnessMultiplier) + brightnessMultiplier);
  20. return vec4(bodyColor);
  21. }
  22. vec4 getOuterBodyColor(in vec4 bodyColor)
  23. {
  24. float darknessMultiplier = 0.1;
  25. bodyColor.r = min(1.0, bodyColor.r / (1.0 + darknessMultiplier));
  26. bodyColor.g = min(1.0, bodyColor.g / (1.0 + darknessMultiplier));
  27. bodyColor.b = min(1.0, bodyColor.b / (1.0 + darknessMultiplier));
  28. return vec4(bodyColor);
  29. }
  30. void main()
  31. {
  32. float borderSize = defaultBorderSize*borderSizeMultiplier;
  33. float transitionSize = defaultTransitionSize;
  34. float outerShadowSize = defaultOuterShadowSize;
  35. // output var
  36. vec4 out_color = vec4(0.0);
  37. // dynamic color calculations
  38. vec4 borderColor = vec4(colBorder.x, colBorder.y, colBorder.z, 1.0);
  39. vec4 bodyColor = vec4(colBody.x, colBody.y, colBody.z, 0.7*bodyAlphaMultiplier);
  40. vec4 outerShadowColor = vec4(0, 0, 0, 0.25);
  41. vec4 innerBodyColor = getInnerBodyColor(bodyColor);
  42. vec4 outerBodyColor = getOuterBodyColor(bodyColor);
  43. innerBodyColor.rgb *= bodyColorSaturation;
  44. outerBodyColor.rgb *= bodyColorSaturation;
  45. // osu!next style color modifications
  46. if (style == 1)
  47. {
  48. outerBodyColor.rgb = bodyColor.rgb * bodyColorSaturation;
  49. outerBodyColor.a = 1.0*bodyAlphaMultiplier;
  50. innerBodyColor.rgb = bodyColor.rgb * 0.5 * bodyColorSaturation;
  51. innerBodyColor.a = 0.0;
  52. }
  53. // a bit of a hack, but better than rough edges
  54. if (borderSizeMultiplier < 0.01)
  55. borderColor = outerShadowColor;
  56. if (part == 1) // render body
  57. {
  58. outerShadowSize = 0.0;
  59. transitionSize = 0.0;
  60. borderSize = 0.0;
  61. }
  62. else // render border
  63. {
  64. // the border is done by the mesh, force full body
  65. borderSize = 1.0;
  66. // this smoothes the outer edge of the border of the slider
  67. // (it's impossible to smoooth the inner edge of the border without an fbo, since we are using the mesh as a crude stencil)
  68. transitionSize = 0.03;
  69. }
  70. // conditional variant
  71. if (tex_coord.x < outerShadowSize - transitionSize) // just shadow
  72. {
  73. float delta = tex_coord.x / (outerShadowSize - transitionSize);
  74. out_color = mix(vec4(0), outerShadowColor, delta);
  75. }
  76. if (tex_coord.x > outerShadowSize - transitionSize && tex_coord.x < outerShadowSize + transitionSize) // shadow + border
  77. {
  78. float delta = (tex_coord.x - outerShadowSize + transitionSize) / (2.0*transitionSize);
  79. out_color = mix(outerShadowColor, borderColor, delta);
  80. }
  81. if (tex_coord.x > outerShadowSize + transitionSize && tex_coord.x < outerShadowSize + borderSize - transitionSize) // just border
  82. {
  83. out_color = borderColor;
  84. }
  85. if (tex_coord.x > outerShadowSize + borderSize - transitionSize && tex_coord.x < outerShadowSize + borderSize + transitionSize) // border + outer body
  86. {
  87. float delta = (tex_coord.x - outerShadowSize - borderSize + transitionSize) / (2.0*transitionSize);
  88. out_color = mix(borderColor, outerBodyColor, delta);
  89. }
  90. if (tex_coord.x > outerShadowSize + borderSize + transitionSize) // outer body + inner body
  91. {
  92. float size = outerShadowSize + borderSize + transitionSize;
  93. float delta = ((tex_coord.x - size) / (1.0-size));
  94. out_color = mix(outerBodyColor, innerBodyColor, delta);
  95. }
  96. // linear variant
  97. /*
  98. // just shadow
  99. float delta = tex_coord.x/(outerShadowSize-transitionSize);
  100. out_color += mix(vec4(0.0), outerShadowColor, delta) * clamp(ceil(-delta+1.0), 0.0, 1.0);
  101. // shadow + border
  102. delta = (tex_coord.x - outerShadowSize + transitionSize) / (2.0*transitionSize);
  103. 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);
  104. // just border
  105. 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);
  106. // border + outer body
  107. delta = (tex_coord.x - outerShadowSize - borderSize + transitionSize) / (2.0*transitionSize);
  108. 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);
  109. // outer body + inner body
  110. delta = outerShadowSize + borderSize + transitionSize;
  111. delta = (tex_coord.x - delta) / (1.0-delta); // [VARIABLE REUSING INTENSIFIES]
  112. out_color += mix(outerBodyColor, innerBodyColor, delta) * clamp(ceil(tex_coord.x - (outerShadowSize + borderSize + transitionSize)), 0.0, 1.0);
  113. */
  114. gl_FragColor = out_color;
  115. }