#pragma target 4.5

#if defined(WRITE_NORMAL_BUFFER) || FORCE_NORMAL_VARYING
#define NEEDS_NORMAL 1
#elif (SHADERPASS == SHADERPASS_DEPTHONLY)
#define NEEDS_NORMAL SHADERGRAPH_NEEDS_NORMAL_DEPTHONLY
#elif (SHADERPASS == SHADERPASS_DEPTHNORMALSONLY)
#define NEEDS_NORMAL SHADERGRAPH_NEEDS_NORMAL_DEPTHNORMALS
#else
#define NEEDS_NORMAL 0
#endif

#if defined(WRITE_NORMAL_BUFFER)
#define NEEDS_TANGENT 1
#elif (SHADERPASS == SHADERPASS_DEPTHONLY)
#define NEEDS_TANGENT SHADERGRAPH_NEEDS_TANGENT_DEPTHONLY
#elif (SHADERPASS == SHADERPASS_DEPTHNORMALSONLY)
#define NEEDS_TANGENT SHADERGRAPH_NEEDS_TANGENT_DEPTHNORMALS
#else
#define NEEDS_TANGENT 0
#endif

#define NEEDS_WORLDPOS VFX_NEEDS_POSWS_INTERPOLATOR

struct ps_input
{
    float4 pos : SV_POSITION;
    #if USE_FLIPBOOK_INTERPOLATION
    float4 uv : TEXCOORD0;
    #else
        #if USE_FLIPBOOK_ARRAY_LAYOUT
        float3 uv : TEXCOORD0;
        #else
        float2 uv : TEXCOORD0;    
        #endif
    #endif
    #if USE_ALPHA_TEST || USE_FLIPBOOK_INTERPOLATION || VFX_USE_ALPHA_CURRENT
    // x: alpha threshold
    // y: frame blending factor
    // z: alpha
    // w: smoothness
    VFX_OPTIONAL_INTERPOLATION float4 builtInInterpolants : TEXCOORD1;
    #endif
    
    #if USE_FLIPBOOK_MOTIONVECTORS
    // x: motion vector scale u
    // y: motion vector scale v
    VFX_OPTIONAL_INTERPOLATION float2 builtInInterpolants2 : TEXCOORD2;
    #endif
    
    #if NEEDS_NORMAL
    float4 normal : TEXCOORD3; // normal scale is stored in w
    #endif
    #if NEEDS_TANGENT
    float3 tangent : TEXCOORD4;
    #endif
    #if USE_NORMAL_BENDING
    float2 bentFactors : TEXCOORD5;
    #endif
    #if NEEDS_WORLDPOS
    float3 posWS : TEXCOORD6;
    #endif
    
    ${VFXAdditionalInterpolantsDeclaration}

    UNITY_VERTEX_OUTPUT_STEREO
    VFX_VERTEX_OUTPUT_INSTANCE_INDEX
};

#define VFX_VARYING_PS_INPUTS ps_input
#define VFX_VARYING_POSCS pos
#define VFX_VARYING_ALPHA builtInInterpolants.z
#define VFX_VARYING_ALPHATHRESHOLD builtInInterpolants.x
#define VFX_VARYING_FRAMEBLEND builtInInterpolants.y
#define VFX_VARYING_MOTIONVECTORSCALE builtInInterpolants2.xy
#define VFX_VARYING_UV uv

#if NEEDS_NORMAL
#define VFX_VARYING_NORMAL normal.xyz
#endif
#if NEEDS_TANGENT
#define VFX_VARYING_TANGENT tangent
#endif
#if NEEDS_WORLDPOS
#define VFX_VARYING_POSWS posWS
#endif
#if USE_NORMAL_MAP && NEEDS_NORMAL
#define VFX_VARYING_NORMALSCALE normal.w
#endif
#if USE_NORMAL_BENDING
#define VFX_VARYING_BENTFACTORS bentFactors
#endif

${VFXBegin:VFXVertexAdditionalProcess}
${VFXURPLitFillVaryings}
${VFXEnd}

${VFXInclude("Shaders/ParticlePlanarPrimitives/Pass.template")}
${VFXPassDepthCommonFragmentURPLit}
