// Milku Shader lol
Shader "#Milku/ToonV2" {
    Properties {
        _Diffuse ("Main Tex", 2D) = "white" {}
        _SkinFunc ("SkinFunc", 2D) = "white" {}
        _HighlightFunc ("HighlightFunc", 2D) = "black" {}
        _Cubemap ("Cubemap", Cube) = "_Skybox" {}
        _SkinSubsurf ("SkinSubsurf", Color) = (0,0,0,1)
        [MaterialToggle] _Color ("Solid Color?", Float ) = 0
        _color ("color", Color) = (0.5,0.5,0.5,1)
        _LightDesaturate ("LightDesaturate", Float ) = 1
        _highlightint ("highlightint", Float ) = 1
        _FuncEffect ("FuncStrength", Range(0, 1)) = 0
        _Metal ("Cubemap Strength", Float ) = 0
    }
    SubShader {
        Tags {
            "RenderType"="Opaque" "Queue"="Overlay+999999999" "LightMode"="ForwardBase"
        }
        Pass {
            Name "Outline"
            Tags {
            }
            Cull Front
			Lighting On
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_shadowcaster
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            uniform float _Outline;
            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( float4(v.vertex.xyz + v.normal*_Outline,1) );
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                return fixed4(float3(0,0,0),0);
            }
            ENDCG
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            Stencil {
                Ref 128
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
            uniform sampler2D _SkinFunc; uniform float4 _SkinFunc_ST;
            float3 Function_node_4656( float3 normal , float intensity ){
            return ShadeSH9(half4(normal, intensity));
            
            
            }
            
            uniform sampler2D _HighlightFunc; uniform float4 _HighlightFunc_ST;
            uniform samplerCUBE _Cubemap;
            uniform float4 _SkinSubsurf;
            uniform sampler2D _SkinFunc_copy; uniform float4 _SkinFunc_copy_ST;
            uniform fixed _Color;
            uniform float4 _color;
            uniform float _LightDesaturate;
            uniform float _highlightint;
            uniform float _FuncEffect;
            uniform float _Metal;
            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float2 texcoord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 posWorld : TEXCOORD1;
                float3 normalDir : TEXCOORD2;
                float3 tangentDir : TEXCOORD3;
                float3 bitangentDir : TEXCOORD4;
                LIGHTING_COORDS(5,6)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
                o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                float3 lightColor = _LightColor0.rgb;
                o.pos = UnityObjectToClipPos( v.vertex );
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                i.normalDir = normalize(i.normalDir);
                float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 normalDirection = i.normalDir;
                float3 viewReflectDirection = reflect( -viewDirection, normalDirection );
                float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
                float3 lightColor = _LightColor0.rgb;
                float3 halfDirection = normalize(viewDirection+lightDirection);
////// Lighting:
                float attenuation = LIGHT_ATTENUATION(i);
////// Emissive:
                float2 node_6613 = saturate(float2((pow(1.0-max(0,dot((i.normalDir+mul( float3(-0.1,0,0), tangentTransform ).xyz.rgb), viewDirection)),1.0)*-1.0+1.0),0.0));
                float4 _HighlightFunc_var = tex2D(_HighlightFunc,TRANSFORM_TEX(node_6613, _HighlightFunc));
                float node_1251 = max(0,dot(lightDirection,i.normalDir));
                float node_2533 = 0.0;
                float2 node_9343 = (float2((node_1251*0.5+0.5),node_2533)*(1.0 - (pow(1.0-max(0,dot(normalDirection, viewDirection)),0.8)*0.8+0.0))*attenuation);
                float4 _SkinFunc_copy_var = tex2D(_SkinFunc_copy,TRANSFORM_TEX(node_9343, _SkinFunc_copy));
                float3 node_2835 = lerp(clamp(pow(Function_node_4656( i.normalDir , 4.8 ),1.0),0.3,1),dot(clamp(pow(Function_node_4656( i.normalDir , 4.8 ),1.0),0.3,1),float3(0.3,0.59,0.11)),0.5);
                float3 node_736 = clamp(lerp(_LightColor0.rgb,dot(_LightColor0.rgb,float3(0.3,0.59,0.11)),_LightDesaturate),0.4,5);
                float3 emissive = ((_HighlightFunc_var.rgb*_highlightint)+(_SkinFunc_copy_var.a*_SkinSubsurf.rgb*node_2835*node_736));
                float4 _Diffuse_var = tex2D(_Diffuse,TRANSFORM_TEX(i.uv0, _Diffuse));
                float3 _Color_var = lerp( _Diffuse_var.rgb, _color.rgb, _Color );
                float2 node_5834 = (float2(clamp(node_1251,0.02,1),node_2533)*attenuation);
                float4 _SkinFunc_var = tex2D(_SkinFunc,TRANSFORM_TEX(node_5834, _SkinFunc));
                float node_7397 = 1.0;
                float3 finalColor = emissive + saturate(lerp(((node_2835*_Color_var)*lerp(_SkinFunc_var.rgb,float3(node_7397,node_7397,node_7397),_FuncEffect)*node_736),((((node_736*lerp((pow(texCUBE(_Cubemap,viewReflectDirection).rgb,2.0)*40.0),dot((pow(texCUBE(_Cubemap,viewReflectDirection).rgb,2.0)*40.0),float3(0.3,0.59,0.11)),0.7))*_Color_var)*_Metal)+(attenuation*clamp(pow((max(0,dot(i.normalDir,halfDirection))*1.1),80.0),0,2))),_Metal));
                return fixed4(finalColor,1);
            }
            ENDCG
        }
        Pass {
            Name "FORWARD_DELTA"
            Tags {
                "LightMode"="ForwardAdd"
            }
            Blend One One
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDADD
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"
            #pragma multi_compile_fwdadd_fullshadows
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
            uniform sampler2D _SkinFunc; uniform float4 _SkinFunc_ST;
            float3 Function_node_4656( float3 normal , float intensity ){
            return ShadeSH9(half4(normal, intensity));
            
            
            }
            
            uniform sampler2D _HighlightFunc; uniform float4 _HighlightFunc_ST;
            uniform samplerCUBE _Cubemap;
            uniform float4 _SkinSubsurf;
            uniform sampler2D _SkinFunc_copy; uniform float4 _SkinFunc_copy_ST;
            uniform fixed _Color;
            uniform float4 _color;
            uniform float _LightDesaturate;
            uniform float _highlightint;
            uniform float _FuncEffect;
            uniform float _Metal;
            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float2 texcoord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 posWorld : TEXCOORD1;
                float3 normalDir : TEXCOORD2;
                float3 tangentDir : TEXCOORD3;
                float3 bitangentDir : TEXCOORD4;
                LIGHTING_COORDS(5,6)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
                o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                float3 lightColor = _LightColor0.rgb;
                o.pos = UnityObjectToClipPos( v.vertex );
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                i.normalDir = normalize(i.normalDir);
                float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 normalDirection = i.normalDir;
                float3 viewReflectDirection = reflect( -viewDirection, normalDirection );
                float3 lightDirection = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w));
                float3 lightColor = _LightColor0.rgb;
                float3 halfDirection = normalize(viewDirection+lightDirection);
////// Lighting:
                float attenuation = LIGHT_ATTENUATION(i);
                float3 node_2835 = lerp(clamp(pow(Function_node_4656( i.normalDir , 4.8 ),1.0),0.3,1),dot(clamp(pow(Function_node_4656( i.normalDir , 4.8 ),1.0),0.3,1),float3(0.3,0.59,0.11)),0.5);
                float4 _Diffuse_var = tex2D(_Diffuse,TRANSFORM_TEX(i.uv0, _Diffuse));
                float3 _Color_var = lerp( _Diffuse_var.rgb, _color.rgb, _Color );
                float node_1251 = max(0,dot(lightDirection,i.normalDir));
                float node_2533 = 0.0;
                float2 node_5834 = (float2(clamp(node_1251,0.02,1),node_2533)*attenuation);
                float4 _SkinFunc_var = tex2D(_SkinFunc,TRANSFORM_TEX(node_5834, _SkinFunc));
                float node_7397 = 1.0;
                float3 node_736 = clamp(lerp(_LightColor0.rgb,dot(_LightColor0.rgb,float3(0.3,0.59,0.11)),_LightDesaturate),0.4,5);
                float3 finalColor = saturate(lerp(((node_2835*_Color_var)*lerp(_SkinFunc_var.rgb,float3(node_7397,node_7397,node_7397),_FuncEffect)*node_736),((((node_736*lerp((pow(texCUBE(_Cubemap,viewReflectDirection).rgb,2.0)*40.0),dot((pow(texCUBE(_Cubemap,viewReflectDirection).rgb,2.0)*40.0),float3(0.3,0.59,0.11)),0.7))*_Color_var)*_Metal)+(attenuation*clamp(pow((max(0,dot(i.normalDir,halfDirection))*1.1),80.0),0,2))),_Metal));
                return fixed4(finalColor * 1,0);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}
