#ifndef SFX_PASS_INCLUDED
#define SFX_PASS_INCLUDED

#if MAIN_PASS
v2f vert (appdata v){
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f, o);
    UNITY_SETUP_INSTANCE_ID(v);
    UNITY_TRANSFER_INSTANCE_ID(v, o);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

    #if X_FEATURES
        o.pulseSpeed = GetPulse();
    #else
        o.pulseSpeed = 1;
    #endif
    o.cameraPos = GetCameraPos();
    o.objPos = GetObjPos();
    o.objDist = distance(o.cameraPos, o.objPos);

    float gf = smoothstep(_MaxRange, clamp(_MinRange, 0, _MaxRange-0.001),  o.objDist);
    o.globalF = gf;
    o.colorF = GetFalloff(_ColorUseGlobal, gf, _ColorMinRange, _ColorMaxRange, o.objDist);
    o.shakeF = GetFalloff(_ShakeUseGlobal, gf, _ShakeMinRange, _ShakeMaxRange, o.objDist);
    o.distortionF = GetFalloff(_DistortionUseGlobal, gf, _DistortionMinRange, _DistortionMaxRange, o.objDist);
    o.blurF = GetFalloff(_BlurUseGlobal, gf, _BlurMinRange, _BlurMaxRange, o.objDist);
    o.noiseF = GetFalloff(_NoiseUseGlobal, gf, _NoiseMinRange, _NoiseMaxRange, o.objDist);
    #if X_FEATURES
        o.sstF = GetFalloff(_SSTUseGlobal, gf, _SSTMinRange, _SSTMaxRange, o.objDist);
        o.olF = GetFalloff(_OLUseGlobal, gf, _OLMinRange, _OLMaxRange, o.objDist);
    #endif

    if (unity_OrthoParams.w == 1){
        v.vertex.y *= 10;
        v.vertex.x *= 20;
    }
    else {
        v.vertex.x *= 1.4;
    }

    float4 wPos = mul(unity_CameraToWorld, v.vertex);
    float4 oPos = mul(unity_WorldToObject, wPos);
    o.raycast = UnityObjectToViewPos(oPos).xyz * float3(-1,-1,1);

    o.worldPos = wPos;
    o.pos = GetScreenspaceVertexPos(v.vertex);
    o.uv = ComputeGrabScreenPos(o.pos);
    o.uvd = TRANSFORM_TEX(v.uv, _NormalMap) + _Time.y * _DistortionSpeed;
    audioLinkData ald = (audioLinkData)0;
    #if AUDIOLINK_ENABLED
        InitializeAudioLink(ald, 0);
    #endif
    #if SHAKE_ENABLED
        ApplyNoiseShake(o, ald);
    #endif
    return o;
}

float4 frag (v2f i) : SV_Target {
    
    #if defined(SHADER_API_MOBILE)
        discard;
    #endif
    
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);

    MirrorCheck();

    float2 uv = i.uv.xy / i.uv.w;
    i.uv.xy = uv;
    i.viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);

    audioLinkData ald = (audioLinkData)0;
    #if AUDIOLINK_ENABLED
        InitializeAudioLink(ald, 0);
    #endif

    #if X_FEATURES
        ApplyPulse(i.pulseSpeed);
        ApplyUVManip(i, ald);
    #endif

    #if SHAKE_ENABLED
        ApplyShake(i, ald);
    #endif

    #if DISTORTION_ENABLED
        ApplyMapDistortion(i, ald);
    #elif DISTORTION_WORLD_ENABLED
        ApplyWGDistortion(i, ald); 
    #endif
    
    #if BLUR_ENABLED
        #if DOF_ENABLED
            float dof = GetDoF(i);
            _BlurStr = lerp(_BlurStr, 0, dof);
            _RippleGridStr = lerp(_RippleGridStr, 0, dof);
            _PixelationStr = lerp(_PixelationStr, 0, dof);
        #endif
        ApplyRipplePixelate(i, ald);
        float4 col = MOCHIE_SAMPLE_TEX2D_SCREENSPACE(_MSFXGrab, i.uv.xy);
        ApplyDitherBlur(i, ald);
        float4 blurCol = MOCHIE_SAMPLE_TEX2D_SCREENSPACE(_MSFXGrab, i.uv.xy);
        ApplyBlur(i, col.rgb, blurCol.rgb, ald);
    #else
        float4 col = MOCHIE_SAMPLE_TEX2D_SCREENSPACE(_MSFXGrab, i.uv.xy);
    #endif

    #if X_FEATURES
        float miscAudioLinkStrength = 1;
        #if AUDIOLINK_ENABLED
            miscAudioLinkStrength = GetAudioLinkBand(ald, _AudioLinkMiscStrength, _AudioLinkMiscBand, _AudioLinkMiscMin, _AudioLinkMiscMax);
        #endif
        ApplyDepthBuffer(i, col.rgb, miscAudioLinkStrength);
        ApplyNormalMap(i, col.rgb, miscAudioLinkStrength);
        #if SOBEL_FILTER_ENABLED
            ApplySobelFilter(i, col.rgb, miscAudioLinkStrength);
        #endif
        #if OUTLINE_ENABLED
            ApplyOutline(i, col.rgb, ald);
        #endif
        ApplyRounding(i, col.rgb, miscAudioLinkStrength);
    #endif

    #if COLOR_ENABLED
        ApplyColor(i, col.rgb, ald);
    #endif

    #if NOISE_ENABLED
        ApplyNoise(i, col.rgb, ald);
    #endif

    #if COLOR_ENABLED
        if (_ClampToggle == 1)
            col = clamp(col, 0, _ClampMax);
    #endif

    ApplyTransparency(i, col);
    return col;
}
#elif X_FEATURES
    #include "SFXXPasses.cginc"
#endif
#endif