// This shader draws a texture on the mesh.
Shader "custom/ship"
{
    // The _BaseMap variable is visible in the Material's Inspector, as a field
    // called Base Map.
    Properties
    { 
        [HDR] _Color1("Color 1", Color) = (1,1,1,1)
        [HDR] _Color2("Color 2", Color) = (1,1,1,1)
        [HDR] _FlashColor("Flash Color", Color) = (1.1,1.1,1.1,1)
        _FadeStrength("Fade Strength", Float) = 0.1
        _VertexScale("Vertex Scale", Float) = 0
        _FlashAmount("Flash Amount", Float) = 0
        _NoiseMap("Noise Map", 2D) = "black"
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"            

            struct Attributes
            {
                float4 positionOS   : POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            float4 _Color1;
            float4 _Color2;
            float4 _FlashColor;
            float _VertexScale;
            float _FadeStrength;
            float _FlashAmount;
            float _PlayerXPos;
            
            // This macro declares _BaseMap as a Texture2D object.
            TEXTURE2D(_BaseMap);
            // This macro declares the sampler for the _BaseMap texture.
            SAMPLER(sampler_BaseMap);
            TEXTURE2D(_NoiseMap);
            SAMPLER(sampler_NoiseMap);

            CBUFFER_START(UnityPerMaterial)
                // The following line declares the _BaseMap_ST variable, so that you
                // can use the _BaseMap variable in the fragment shader. The _ST 
                // suffix is necessary for the tiling and offset function to work.
                float4 _BaseMap_ST;
                float4 _NoiseMap_ST;
            CBUFFER_END
            
            Varyings vert(Attributes IN)
            {
                Varyings OUT;

                float3 vpos = IN.positionOS.xyz;
                float3 wpos = TransformObjectToWorld(vpos);
                
                float d = 1.0+length(wpos)*0.5;
                wpos.x -= _PlayerXPos;
                wpos += _VertexScale*float3(0,0,1)*d;
                // float2 uv = wpos.yx;
                // float noise = SAMPLE_TEXTURE2D_LOD(_NoiseMap, sampler_NoiseMap, uv, 0) -0.5;

                vpos = TransformWorldToObject(wpos);

                // noise *= d*d * 0.1;
                
                // vpos *= lerp (0.9,1.1,noise);
                
                OUT.positionHCS = TransformObjectToHClip(vpos);
                // The TRANSFORM_TEX macro performs the tiling and offset
                // transformation.
                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // calculate pixel
                float2 res = _ScreenParams;
                float2 p = -1.0+2.0*IN.positionHCS.xy/res.xy;

                float t = length(p);
                float4 shaderColor = lerp(_Color1,_Color2,t * _FadeStrength);
                return lerp(shaderColor, _FlashColor, _FlashAmount);
            }
            ENDHLSL
        }
    }
}