﻿// Copyright (C) Itseez3D, Inc. - All Rights Reserved
// You may not use this file except in compliance with an authorized license
// Unauthorized copying of this file, via any medium is strictly prohibited
// Proprietary and confidential
// UNLESS REQUIRED BY APPLICABLE LAW OR AGREED BY ITSEEZ3D, INC. IN WRITING, SOFTWARE DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED
// See the License for the specific language governing permissions and limitations under the License.
// Written by Itseez3D, Inc. <support@avatarsdk.com>, January 2020

// Shader that draws haircuts with transparent texture parts.
Shader "Avatar SDK/HaircutSolidUnlitShader"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _ColorTarget("ColorTarget", Vector) = (1, 1, 1, 0)
        _ColorTint("ColorTint", Vector) = (0, 0, 0, 0)
        _TintCoeff("TintCoeff", Float) = 0.8
        _MultiplicationTintThreshold("MultiplicationTintThreshold", Float) = 0.2
    }

    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType" = "TransparentCutout" "IgnoreProjector" = "True" }
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            Cull Front
            ZWrite Off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Input
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _ColorTarget;
            fixed4 _ColorTint;
            float _TintCoeff;
            float _MultiplicationTintThreshold;

            Input vert(appdata v)
            {
                Input o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag(Input i) : COLOR
            {
                fixed4 colorTexture = tex2D(_MainTex, i.uv);
                float threshold = _MultiplicationTintThreshold;
                fixed4 tinted = colorTexture + _TintCoeff * _ColorTint;

                float maxTargetChannel = max(_ColorTarget.r, max(_ColorTarget.g, _ColorTarget.b));
                if (maxTargetChannel < threshold)
                {
                    float darkeningCoeff = min(0.85, (threshold - maxTargetChannel) / threshold);
                    tinted = (1.0 - darkeningCoeff) * tinted + darkeningCoeff * (_ColorTarget * colorTexture);
                }

                return fixed4(tinted.rgb, colorTexture.a);
            }

            ENDCG
        }

        Pass
        {
            Cull Back
            ZWrite On
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Input
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _ColorTarget;
            fixed4 _ColorTint;
            float _TintCoeff;
            float _MultiplicationTintThreshold;

            Input vert(appdata v)
            {
                Input o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag(Input i) : COLOR
            {
                fixed4 colorTexture = tex2D(_MainTex, i.uv);
                float threshold = _MultiplicationTintThreshold;
                fixed4 tinted = colorTexture + _TintCoeff * _ColorTint;

                float maxTargetChannel = max(_ColorTarget.r, max(_ColorTarget.g, _ColorTarget.b));
                if (maxTargetChannel < threshold)
                {
                    float darkeningCoeff = min(0.85, (threshold - maxTargetChannel) / threshold);
                    tinted = (1.0 - darkeningCoeff) * tinted + darkeningCoeff * (_ColorTarget * colorTexture);
                }

                return fixed4(tinted.rgb, colorTexture.a);
            }

            ENDCG
        }
    }

    //FallBack "Diffuse"
}
