﻿Shader "Unlit/VariableHistogramShader"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_bkgColor ("Background Color", Color) = (0,0,0,1)
		_gridColor ("Grid Color", Color) = (0.2,0.2,0.2,1)
		_dataColor ("Data Color", Color) = (1,0,0,1)
		_barColor ("CurTime Bar Color", Color) = (0,1,1,1)
		_gridSpacing("Grid Y Spacing in pixels", int) = 50
		_minCoords("Min Coord Values", Vector) = (0,0,0,0)
		_maxCoords("Max Coord Values", Vector) = (1,1,1,1)
	}

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
				float4 coords : TEXCOORD2;
            };

            sampler2D _MainTex;
			float4 _MainTex_ST;

			float4 _bkgColor;
			float4 _gridColor;
			float4 _dataColor;
			float4 _barColor;

			int _gridSpacing;

			float4 _minCoords;
			float4 _maxCoords;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

				float histCoordx = lerp(_minCoords.x, _maxCoords.x, v.uv.x);
				float histCoordy = 0.5;
				float barcoordx = lerp(_minCoords.z, _maxCoords.z, v.uv.x);
				float gridcoordy = lerp(_minCoords.w, _maxCoords.w, v.uv.y);

				o.coords = float4(histCoordx, gridcoordy, barcoordx, gridcoordy);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				// grid
				float4 color = ((((int)i.coords.w) % _gridSpacing) == 0) ? _gridColor : _bkgColor;

				// histogram
				float4 val = tex2D(_MainTex, i.coords.xy);
				float alpha = (i.uv.y < val.w) ? _dataColor.a : 0.0f;
				color = lerp(color, float4(val.xyz, 1), alpha);

				// bar
				alpha = (abs(floor(i.coords.z)) < 1) ? _barColor.a : 0.0;
				return lerp(color, _barColor, alpha);
            }
            ENDCG
        }
    }
}
