GibTreaty

PieWheel.shader

Aug 24th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.30 KB | None | 0 0
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2.  
  3. Shader "UI/UI Pie Wheel"
  4. {
  5. Properties
  6. {
  7. [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
  8. _Color ("Tint", Color) = (1,1,1,1)
  9. _Slices("Slices", int) = 4
  10. _InnerRadius("Inner Radius", Range(0, 1)) = 0
  11. _SliceGap("Slice Gap", Range(0, 1)) = .2
  12. _GapSoftness("Gap Softness", float) = 400
  13. _HighlightSlice("Highlight Slice", int) = 0
  14.  
  15. _StencilComp ("Stencil Comparison", Float) = 8
  16. _Stencil ("Stencil ID", Float) = 0
  17. _StencilOp ("Stencil Operation", Float) = 0
  18. _StencilWriteMask ("Stencil Write Mask", Float) = 255
  19. _StencilReadMask ("Stencil Read Mask", Float) = 255
  20.  
  21. _ColorMask ("Color Mask", Float) = 15
  22. }
  23.  
  24. SubShader
  25. {
  26. Tags
  27. {
  28. "Queue"="Transparent"
  29. "IgnoreProjector"="True"
  30. "RenderType"="Transparent"
  31. "PreviewType"="Plane"
  32. "CanUseSpriteAtlas"="True"
  33. }
  34.  
  35. Stencil
  36. {
  37. Ref [_Stencil]
  38. Comp [_StencilComp]
  39. Pass [_StencilOp]
  40. ReadMask [_StencilReadMask]
  41. WriteMask [_StencilWriteMask]
  42. }
  43.  
  44. Cull Off
  45. Lighting Off
  46. ZWrite Off
  47. ZTest [unity_GUIZTestMode]
  48. Blend SrcAlpha OneMinusSrcAlpha
  49. ColorMask [_ColorMask]
  50.  
  51. Pass
  52. {
  53. CGPROGRAM
  54. #pragma vertex vert
  55. #pragma fragment frag
  56. #include "UnityCG.cginc"
  57.  
  58. struct appdata_t
  59. {
  60. float4 vertex : POSITION;
  61. float4 color : COLOR;
  62. float2 texcoord : TEXCOORD0;
  63. };
  64.  
  65. struct v2f
  66. {
  67. float4 vertex : SV_POSITION;
  68. fixed4 color : COLOR;
  69. half2 texcoord : TEXCOORD0;
  70. };
  71.  
  72. fixed4 _Color;
  73. int _Slices;
  74. float _InnerRadius;
  75. float _SliceGap;
  76. float _GapSoftness;
  77. float _HighlightSlice;
  78.  
  79. v2f vert(appdata_t IN)
  80. {
  81. v2f OUT;
  82. OUT.vertex = UnityObjectToClipPos(IN.vertex);
  83. OUT.texcoord = IN.texcoord;
  84. #ifdef UNITY_HALF_TEXEL_OFFSET
  85. OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
  86. #endif
  87. OUT.color = IN.color * _Color;
  88. return OUT;
  89. }
  90.  
  91. sampler2D _MainTex;
  92.  
  93. fixed4 frag(v2f IN) : SV_Target
  94. {
  95. half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
  96.  
  97. float alpha = color.a;
  98. float2 direction = 1 - IN.texcoord - float2(.5, .5);
  99. float distance = (1 - clamp(length(abs(IN.texcoord - float2(.5, .5))), 0 , 1)) - .5;
  100.  
  101. if(distance < .01)
  102. color.a = min(distance * 200, 1);
  103. else
  104. color.a = ceil(distance);
  105.  
  106. //color.a = distance > (1 - _InnerRadius) * .5 ? 0 : color.a;
  107.  
  108. //color.a *= ((1 - _InnerRadius) * .5) / distance;
  109.  
  110. if(distance > (1 - _InnerRadius) * .5)
  111. color.a = 0;
  112.  
  113. color.a = lerp(color.a, color.a * .5, step(.02, distance));
  114. color.a = lerp(color.a, color.a / .25, step(.23, distance));
  115.  
  116. if(_Slices > 1) {
  117. float angleSize = float(360) / float(_Slices);
  118. float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
  119.  
  120. angle += (angleSize / 2);
  121.  
  122. float nearestAngle = round(angle / angleSize) * angleSize;
  123.  
  124. float edgeMask = 0;
  125.  
  126. //edgeMask = nearestAngle - angle;
  127. edgeMask = saturate(angle - nearestAngle);
  128. edgeMask = edgeMask + saturate(nearestAngle - angle);
  129.  
  130. //edgeMask = lerp(edgeMask, edgeMask*.2, step(.2, edgeMask));
  131. edgeMask *= .25;
  132.  
  133. color.a += edgeMask;
  134. //color.a -= edgeMask * _GapSoftness;
  135. color.a = max(color.a, 0);
  136. }
  137.  
  138. //color = sliceCircle(color, direction, distance);
  139. //if(false) {
  140. if(_Slices > 1) {
  141. float angleSize = float(360) / float(_Slices);
  142. float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
  143. float angleBefore = angle + (angleSize / 2);
  144.  
  145. angle += (angleSize / 2);
  146.  
  147. float angleModStep = fmod(angle / angleSize, 1);
  148. float angleStep = floor(angle / angleSize);
  149. float angleDistance = 1 - angleModStep;
  150.  
  151. float edgeMask = clamp(angleModStep - (1 - _SliceGap), 0, 1);
  152. edgeMask = clamp(angleDistance - (1 - _SliceGap), 0, 1) + edgeMask;
  153.  
  154. color.a -= edgeMask * _GapSoftness;
  155. color.a = max(color.a, 0);
  156.  
  157. int currentSlice = (fmod(angleBefore / 360, 1) * floor(_Slices)) + 1;
  158. float highlightValue = (floor(_HighlightSlice) == currentSlice ? 1 : 0);
  159.  
  160. color.r += highlightValue;
  161. }
  162.  
  163. color.a = clamp(color.a, 0, 1);
  164. color.a *= alpha;
  165.  
  166. clip (color.a - 0.01);
  167.  
  168. return color;
  169. }
  170.  
  171. /*half4 sliceCircle(half4 color, float2 direction, float distance) {
  172. if(_Slices > 1) {
  173. float angleSize = float(360) / float(_Slices);
  174. float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
  175. float angleBefore = angle + (angleSize / 2);
  176.  
  177. angle += (angleSize / 2);
  178.  
  179. float angleModStep = fmod(angle / angleSize, 1);
  180. float angleStep = floor(angle / angleSize);
  181. float angleDistance = 1 - angleModStep;
  182.  
  183. float edgeMask = clamp(angleModStep - (1 - _SliceGap), 0, 1);
  184. edgeMask = clamp(angleDistance - (1 - _SliceGap), 0, 1) + edgeMask;
  185.  
  186. color.a -= edgeMask * _GapSoftness;
  187. color.a = max(color.a, 0);
  188.  
  189. int currentSlice = (fmod(angleBefore / 360, 1) * floor(_Slices)) + 1;
  190. float highlightValue = (floor(_HighlightSlice) == currentSlice ? 1 : 0);
  191.  
  192. color.r += highlightValue;
  193.  
  194. }
  195.  
  196. return color;
  197. }*/
  198. ENDCG
  199. }
  200. }
  201. }
Advertisement
Add Comment
Please, Sign In to add comment