﻿Shader "SnapshotProHDRP/Cutout"
{
    HLSLINCLUDE

    #pragma target 4.5
    #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch

    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
    #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
    #include "Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/FXAA.hlsl"
    #include "Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/RTUpscale.hlsl"

    struct Attributes
    {
        uint vertexID : SV_VertexID;
        UNITY_VERTEX_INPUT_INSTANCE_ID
    };

    struct Varyings
    {
        float4 positionCS : SV_POSITION;
        float2 texcoord   : TEXCOORD0;
        UNITY_VERTEX_OUTPUT_STEREO
    };

    Varyings Vert(Attributes input)
    {
        Varyings output;
        UNITY_SETUP_INSTANCE_ID(input);
        UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
        output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID);
        output.texcoord = GetFullScreenTriangleTexCoord(input.vertexID);
        return output;
    }

    // List of properties to control your post process effect
    TEXTURE2D_X(_InputTexture);
	TEXTURE2D(_CutoutTex);
	SAMPLER(sampler_CutoutTex);
	float4 _BorderColor;
	int _Stretch;

	float _Zoom;
	float2 _Offset;
	float _Rotation;

    float4 CustomPostProcess(Varyings input) : SV_Target
    {
        UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

		float2 cutoutUVs = (input.texcoord - 0.5f) / _Zoom;
		float aspect = (_Stretch == 0) ? _ScreenSize.x / _ScreenSize.y : 1.0f;
		cutoutUVs = float2(aspect * cutoutUVs.x, cutoutUVs.y);

		float sinRot = sin(_Rotation);
		float cosRot = cos(_Rotation);

		float2x2 rotation = float2x2(cosRot, sinRot, -sinRot, cosRot);

		cutoutUVs = mul(rotation, cutoutUVs);
		cutoutUVs += float2(_Offset.x * aspect, _Offset.y) + 0.5f;

		float cutoutAlpha = SAMPLE_TEXTURE2D(_CutoutTex, sampler_CutoutTex, cutoutUVs).a;

        uint2 positionSS = input.texcoord * _ScreenSize.xy;
		float4 col = LOAD_TEXTURE2D_X(_InputTexture, positionSS);

		return lerp(col, _BorderColor, cutoutAlpha);
    }

    ENDHLSL

    SubShader
    {
        Pass
        {
            Name "Cutout"

            ZWrite Off
            ZTest Always
            Blend Off
            Cull Off

            HLSLPROGRAM
                #pragma fragment CustomPostProcess
                #pragma vertex Vert
            ENDHLSL
        }
    }
    Fallback Off
}
