Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
- Shader "UI/UI Pie Wheel"
- {
- Properties
- {
- [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
- _Color ("Tint", Color) = (1,1,1,1)
- _Slices("Slices", int) = 4
- _InnerRadius("Inner Radius", Range(0, 1)) = 0
- _SliceGap("Slice Gap", Range(0, 1)) = .2
- _GapSoftness("Gap Softness", float) = 400
- _HighlightSlice("Highlight Slice", int) = 0
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
- _ColorMask ("Color Mask", Float) = 15
- }
- SubShader
- {
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- "PreviewType"="Plane"
- "CanUseSpriteAtlas"="True"
- }
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
- Cull Off
- Lighting Off
- ZWrite Off
- ZTest [unity_GUIZTestMode]
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask [_ColorMask]
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct appdata_t
- {
- float4 vertex : POSITION;
- float4 color : COLOR;
- float2 texcoord : TEXCOORD0;
- };
- struct v2f
- {
- float4 vertex : SV_POSITION;
- fixed4 color : COLOR;
- half2 texcoord : TEXCOORD0;
- };
- fixed4 _Color;
- int _Slices;
- float _InnerRadius;
- float _SliceGap;
- float _GapSoftness;
- float _HighlightSlice;
- v2f vert(appdata_t IN)
- {
- v2f OUT;
- OUT.vertex = UnityObjectToClipPos(IN.vertex);
- OUT.texcoord = IN.texcoord;
- #ifdef UNITY_HALF_TEXEL_OFFSET
- OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
- #endif
- OUT.color = IN.color * _Color;
- return OUT;
- }
- sampler2D _MainTex;
- fixed4 frag(v2f IN) : SV_Target
- {
- half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
- float alpha = color.a;
- float2 direction = 1 - IN.texcoord - float2(.5, .5);
- float distance = (1 - clamp(length(abs(IN.texcoord - float2(.5, .5))), 0 , 1)) - .5;
- if(distance < .01)
- color.a = min(distance * 200, 1);
- else
- color.a = ceil(distance);
- //color.a = distance > (1 - _InnerRadius) * .5 ? 0 : color.a;
- //color.a *= ((1 - _InnerRadius) * .5) / distance;
- if(distance > (1 - _InnerRadius) * .5)
- color.a = 0;
- color.a = lerp(color.a, color.a * .5, step(.02, distance));
- color.a = lerp(color.a, color.a / .25, step(.23, distance));
- if(_Slices > 1) {
- float angleSize = float(360) / float(_Slices);
- float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
- angle += (angleSize / 2);
- float nearestAngle = round(angle / angleSize) * angleSize;
- float edgeMask = 0;
- //edgeMask = nearestAngle - angle;
- edgeMask = saturate(angle - nearestAngle);
- edgeMask = edgeMask + saturate(nearestAngle - angle);
- //edgeMask = lerp(edgeMask, edgeMask*.2, step(.2, edgeMask));
- edgeMask *= .25;
- color.a += edgeMask;
- //color.a -= edgeMask * _GapSoftness;
- color.a = max(color.a, 0);
- }
- //color = sliceCircle(color, direction, distance);
- //if(false) {
- if(_Slices > 1) {
- float angleSize = float(360) / float(_Slices);
- float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
- float angleBefore = angle + (angleSize / 2);
- angle += (angleSize / 2);
- float angleModStep = fmod(angle / angleSize, 1);
- float angleStep = floor(angle / angleSize);
- float angleDistance = 1 - angleModStep;
- float edgeMask = clamp(angleModStep - (1 - _SliceGap), 0, 1);
- edgeMask = clamp(angleDistance - (1 - _SliceGap), 0, 1) + edgeMask;
- color.a -= edgeMask * _GapSoftness;
- color.a = max(color.a, 0);
- int currentSlice = (fmod(angleBefore / 360, 1) * floor(_Slices)) + 1;
- float highlightValue = (floor(_HighlightSlice) == currentSlice ? 1 : 0);
- color.r += highlightValue;
- }
- color.a = clamp(color.a, 0, 1);
- color.a *= alpha;
- clip (color.a - 0.01);
- return color;
- }
- /*half4 sliceCircle(half4 color, float2 direction, float distance) {
- if(_Slices > 1) {
- float angleSize = float(360) / float(_Slices);
- float angle = degrees(atan2(direction.x, direction.y)) + 180;// - (angleSize / 2);
- float angleBefore = angle + (angleSize / 2);
- angle += (angleSize / 2);
- float angleModStep = fmod(angle / angleSize, 1);
- float angleStep = floor(angle / angleSize);
- float angleDistance = 1 - angleModStep;
- float edgeMask = clamp(angleModStep - (1 - _SliceGap), 0, 1);
- edgeMask = clamp(angleDistance - (1 - _SliceGap), 0, 1) + edgeMask;
- color.a -= edgeMask * _GapSoftness;
- color.a = max(color.a, 0);
- int currentSlice = (fmod(angleBefore / 360, 1) * floor(_Slices)) + 1;
- float highlightValue = (floor(_HighlightSlice) == currentSlice ? 1 : 0);
- color.r += highlightValue;
- }
- return color;
- }*/
- ENDCG
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment