#define DEPTH_OF_FIELD
#define HQ_DOF
#define AUTOFOCUS
#define DOF_NORMAL_QUALITY
//#define DOF_HIGH_QUALITY
float BlurIntensity = 0.6;
int DoF_TAPS = 60;
int PixelSizeMultiplier = 1;
float2 FocusPoint = float2(0.6, 0.6);
float BloomAmountMix = 0.1;
float BloomAdditive = 0.1;
float AdaptationValue = 1.2;
float toneMapExposure = 1.2;
float DirtyLensEffect = 1.22;
#define	BLOOM_DISTORTION
float BloomDAmount = 0.95;
//#define BLEACH
float BP_factor = 0.65;
#define GlobalSaturation
float Saturation = 1.28;
float AddContrast = 0.25;
float Vignetting = 0.3;
//#define NormalMB
#define AlternativeMB
//#define BLACKBARS

struct VS_OUTPUT_POST
{
	float4 vpos  : POSITION;
	float2 txcoord0 : TEXCOORD0;
};
struct VS_INPUT_POST
{
	float3 pos  : POSITION;
	float2 txcoord0 : TEXCOORD0;
};


float4	_c44 : register(c44);
float4	_c66 : register(c66);
float4	_c72 : register(c72);
float4	_c73 : register(c73);
float4	_c74 : register(c74);
float4	_c75 : register(c75);
float4	_c76 : register(c76);
float4	_c77 : register(c77);
float4	_c78 : register(c78);
float4	_c79 : register(c79);
float4	_c80 : register(c80);
float4	_c81 : register(c81);
float4	_c82 : register(c82);
float4	_c83 : register(c83);
float4	_c84 : register(c84);
float4	_c85 : register(c85);


texture2D texs0 : register(s0);
texture2D texs1 : register(s1);
texture2D texs2 : register(s2);
texture2D texs3 : register(s3);
texture2D texs4 : register(s4);
texture2D texs5 : register(s5);
texture2D texs6 : register(s6);
texture2D texs7 : register(s7);
texture2D texs13 : register(s13);//palette
texture2D texs15 : register(s15);
sampler2D s2=sampler_state { Texture=<texs2>; };
sampler2D s4=sampler_state { Texture=<texs4>; };
#ifdef NormalMB
sampler2D s5=sampler_state { Texture=<texs5>; };
#endif
sampler2D s6=sampler_state { Texture=<texs6>; };
sampler2D s7=sampler_state { Texture=<texs7>; };
sampler2D s15=sampler_state { Texture=<texs15>; };

sampler2D s0 = sampler_state
{
    Texture   = <texs0>;
	MinFilter = LINEAR;//
	MagFilter = LINEAR;//
	MipFilter = NONE;//NONE;//LINEAR;
	AddressU  = Clamp;
	AddressV  = Clamp;
	SRGBTexture=FALSE;
	MaxMipLevel=0;
	MipMapLodBias=0;
};

sampler2D s1 = sampler_state
{
    Texture   = <texs1>;
	MinFilter = LINEAR;//
	MagFilter = LINEAR;//
	MipFilter = NONE;//NONE;//LINEAR;
	AddressU  = Clamp;
	AddressV  = Clamp;
	SRGBTexture=FALSE;
	MaxMipLevel=0;
	MipMapLodBias=0;
};

sampler2D s3 = sampler_state
{
    Texture   = <texs3>;
	MinFilter = LINEAR;//
	MagFilter = LINEAR;//
	MipFilter = NONE;//NONE;//LINEAR;
	AddressU  = Clamp;
	AddressV  = Clamp;
	SRGBTexture=FALSE;
	MaxMipLevel=0;
	MipMapLodBias=0;
};


#ifdef AlternativeMB
sampler2D s5 = sampler_state //fixed
{
Texture   = <texs5>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU  = Wrap;
AddressV  = Wrap;
SRGBTexture=FALSE;
MaxMipLevel=0;
MipMapLodBias=0;
};
#endif

sampler2D s13 = sampler_state
{
Texture   = <texs13>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU  = Clamp;
AddressV  = Clamp;
SRGBTexture=FALSE;
MaxMipLevel=0;
MipMapLodBias=0;
};

float4 addFog( float3 position, float4 colour )
{
float3 eyeDirection = _c44.xyz - position;
float distanceSquared = eyeDirection.x*eyeDirection.x + eyeDirection.y*eyeDirection.y + eyeDirection.z*eyeDirection.z;
//float maxDistanceSquared = 10000000000.0f;
//float fogAmount = min(distanceSquared/maxDistanceSquared,1.0f);
float dist = sqrt(distanceSquared);
float maxDistance = 25000.0f;
float fogAmount = min(dist/maxDistance,1.0f);
//PaulP was colour.rgb = lerp((colour.rgb*1.1),float3(0.9f,0.9f,0.9f),fogAmount);
colour.rgb = lerp((colour.rgb*0.88),float3(0.72f,0.72f,0.72f),fogAmount);
return colour;
}

float4 addIngame( float3 position, float4 colour )
{
float3 tintcolour = float3(1.0, 1.0, 1.0);
float brightness = -0.005;
float contrast = 1.5;
float desaturate = 0.2;
float tint = 0.10;

float luminance = (colour.r+colour.g+colour.b)*0.3333f;
float3 bwcolour = float3(luminance,luminance,luminance);
float3 colourOut = colour.rgb*contrast + brightness;
colourOut = lerp(colourOut,bwcolour,desaturate);
colourOut = lerp(colourOut,tintcolour,tint);

return float4(colourOut,colour.a);
}

float4 PS_C215BE6E(VS_OUTPUT_POST IN) : COLOR
{
	float4 _oC0=0.0; //output
	float4 _c0=float4(0, 0.212500006, 0.715399981, 0.0720999986);
	float4 _c1=float4(0.25, 1, 256, 0);
	float4 _c2=float4(0, 2, 4, 8);
	float4 _c3=float4(58.1640015, 47.1300011, 0, 0);
	float4 _c4=float4(-0.5, -1.5, 1.5, 0.5);
	float4 _c5=float4(2, -1, 0.125, 0);
	float4 _c6=float4(256, 2, 4, 8);
	float4 _c7=float4(1.0, 0.1, 0.8, 1.0);
	float4 _c8=float4(0.0, 0.1, 0.8, 0.333);
	float4 _c9=float4(0.06, 0.1, 0.8, 0.1);
	float4 _c10=float4(0.01, 1.4, 0.0, 0.32);
	float4 _c11=float4(0.333333, 1.0, 0.0, 0.0);
	float4 _c12=float4(0.27, 0.67, 0.06, 0.0);
	float4 _c13=float4(0.0, 0.0, 0.0, 0.00001);
	float4 _c150=float4(0.55, 0.9, 0.85, 0.9);
	float4 _c195=float4(0.0, 0.0, 0.0, 0.07);//0.7
	float4 r0;
	float4 r1;
	float4 r2;
	float4 r3;
	float4 r4;
	float4 r5;
	float4 r6;
	float4 r7;
	float4 r8;
	float4 r9;
	float4 r10;
	float4 r11;
float4 _v0=0.0;
_v0.xy=IN.txcoord0.xy;


r1=tex2D(s2, _v0.xy); //HDRSampler
r2=tex2D(s3, _v0.xy); //BloomSampler



//*************************
#ifdef HQ_DOF
	float2	center;
	float	depth;
	float	focus;
	
	r0=tex2D(s1, _v0.xy); //GBufferTextureSampler3
	r0.y=-_c77.x + _c77.y; //-dofProj.x + dofProj.y
	r0.y=1.0/r0.y;
	r0.z=r0.y * _c77.y; //dofProj.y
	r0.z=r0.z * -_c77.x; //dofProj.x
	r0.x=_c77.y * -r0.y + r0.x;
	r0.x=1.0/r0.x;
	r0.y=r0.z * r0.x;

	r0.w=abs(_c79.w);
	r3=_c4; //-0.5, -1.5, 1.5, 0.5

#ifndef AUTOFOCUS
	float4	vDofParams = float4(-4, 1, 5000.0, 1);
#else
	float4	vDofParams = float4(-5000, 1, 30000.0, 1);
#endif

	depth=r0.z * r0.x - _c78.w; //dofDist.w
	depth+=_c78.y * -r3.w; //dofDist.y
	depth+=148;//offset
	center.x=_v0.x-0.5;
	center.y=0.5-_v0.y;
#endif
	#ifdef DEPTH_OF_FIELD
	r4=tex2D(s1, FocusPoint); //GBufferTextureSampler3
	r4.y=-_c77.x + _c77.y; //-dofProj.x + dofProj.y
	r4.y=1/r4.y;
	r4.z=r4.y * _c77.y; //dofProj.y
	r4.z=r4.z * -_c77.x; //dofProj.x
	r4.x=_c77.y * -r4.y + r4.x;
	r4.x=1/r4.x;
	r4.y=r4.z * r4.x;	
	#ifdef AUTOFOCUS
	float cdepth;

	cdepth=r4.z * r4.x - _c78.w; //dofDist.w
	cdepth+=_c78.y * -r3.w; //dofDist.y
	cdepth+=150;//offset

	
	r4.w = tex2D(s0, FocusPoint).w;
	if(r4.w > 0)
	{
		vDofParams.z = cdepth*10.0;
		vDofParams.y = cdepth;
	}
	#endif
#ifdef HQ_DOF

	depth = max(depth, 0);

	float	dist;

	if(depth < vDofParams.y)
	    dist = (depth - vDofParams.y)/(vDofParams.y - vDofParams.x);
	else
	{
	    dist = (depth - vDofParams.y)/(vDofParams.z - vDofParams.y);
	    dist = clamp(dist, 0, vDofParams.w);
	}

    	dist = dist * 0.5 + 0.5;
#endif
#ifdef DOF_NORMAL_QUALITY

	static float3 poisson[24]=
	{
		float3(1.0, 0.0, 1.0000 ), //0 degrees
		float3(0.0, -1.0, 1.0000 ),
		float3(-1.0, 0.0, 1.0000 ),
		float3(0.0, 1.0, 1.0000 ),

		float3(0.7071, 0.7071, 1.0000 ), //45 degrees
		float3(0.7071, 0.7071, 1.0000 ),
		float3(-0.7071, -0.7071, 1.0000 ),
		float3(-0.7071, 0.7071, 1.0000 ),

		float3(0.9659, 0.2588, 1.0000 ), //15 degrees
		float3(0.2588, -0.9659, 1.0000 ),
		float3(-0.9659, -0.2588, 1.0000 ),
		float3(-0.2588, 0.9659, 1.0000 ),

		float3(0.8660, 0.5000, 1.0000 ), //60 degrees
		float3(0.5000, -0.8660, 1.0000 ),
		float3(-0.8660, -0.5000, 1.0000 ),
		float3(-0.5000, 0.8660, 1.0000 ),

		float3(0.5000, 0.8660, 1.0000 ), //30 degrees
		float3(0.8660, -0.5000, 1.0000 ),
		float3(-0.5000, -0.8660, 1.0000 ),
		float3(-0.8660, 0.5000, 1.0000 ),

		float3(0.2588, 0.9659, 1.0000 ), //75 degrees
		float3(0.9659, -0.2588, 1.0000 ),
		float3(-0.2588, -0.9659, 1.0000 ),
		float3(-0.9659, 0.2588, 1.0000 ),
	};
#endif


#ifdef DOF_HIGH_QUALITY

static float3 poisson[60] =
       {
           float3( 0.2165, 0.1250, 1.0000 ),
           float3( 0.0000, 0.2500, 1.0000 ),
           float3( -0.2165, 0.1250, 1.0000 ),
           float3( -0.2165, -0.1250, 1.0000 ),
           float3( -0.0000, -0.2500, 1.0000 ),
           float3( 0.2165, -0.1250, 1.0000 ),
           float3( 0.4330, 0.2500, 1.0000 ),
           float3( 0.0000, 0.5000, 1.0000 ),
           float3( -0.4330, 0.2500, 1.0000 ),
           float3( -0.4330, -0.2500, 1.0000 ),
           float3( -0.0000, -0.5000, 1.0000 ),
           float3( 0.4330, -0.2500, 1.0000 ),
           float3( 0.6495, 0.3750, 1.0000 ),
           float3( 0.0000, 0.7500, 1.0000 ),
           float3( -0.6495, 0.3750, 1.0000 ),
           float3( -0.6495, -0.3750, 1.0000 ),
           float3( -0.0000, -0.7500, 1.0000 ),
           float3( 0.6495, -0.3750, 1.0000 ),
           float3( 0.8660, 0.5000, 1.0000 ),
           float3( 0.0000, 1.0000, 1.0000 ),
           float3( -0.8660, 0.5000, 1.0000 ),
           float3( -0.8660, -0.5000, 1.0000 ),
           float3( -0.0000, -1.0000, 1.0000 ),
           float3( 0.8660, -0.5000, 1.0000 ),
           float3( 0.2163, 0.3754, 0.8670 ),
           float3( -0.2170, 0.3750, 0.8670 ),
           float3( -0.4333, -0.0004, 0.8670 ),
           float3( -0.2163, -0.3754, 0.8670 ),
           float3( 0.2170, -0.3750, 0.8670 ),
           float3( 0.4333, 0.0004, 0.8670 ),
           float3( 0.4328, 0.5004, 0.8847 ),
           float3( -0.2170, 0.6250, 0.8847 ),
           float3( -0.6498, 0.1246, 0.8847 ),
           float3( -0.4328, -0.5004, 0.8847 ),
           float3( 0.2170, -0.6250, 0.8847 ),
           float3( 0.6498, -0.1246, 0.8847 ),
           float3( 0.6493, 0.6254, 0.9065 ),
           float3( -0.2170, 0.8750, 0.9065 ),
           float3( -0.8663, 0.2496, 0.9065 ),
           float3( -0.6493, -0.6254, 0.9065 ),
           float3( 0.2170, -0.8750, 0.9065 ),
           float3( 0.8663, -0.2496, 0.9065 ),
           float3( 0.2160, 0.6259, 0.8851 ),
           float3( -0.4340, 0.5000, 0.8851 ),
           float3( -0.6500, -0.1259, 0.8851 ),
           float3( -0.2160, -0.6259, 0.8851 ),
           float3( 0.4340, -0.5000, 0.8851 ),
           float3( 0.6500, 0.1259, 0.8851 ),
           float3( 0.4325, 0.7509, 0.8670 ),
           float3( -0.4340, 0.7500, 0.8670 ),
           float3( -0.8665, -0.0009, 0.8670 ),
           float3( -0.4325, -0.7509, 0.8670 ),
           float3( 0.4340, -0.7500, 0.8670 ),
           float3( 0.8665, 0.0009, 0.8670 ),
           float3( 0.2158, 0.8763, 0.9070 ),
           float3( -0.6510, 0.6250, 0.9070 ),
           float3( -0.8668, -0.2513, 0.9070 ),
           float3( -0.2158, -0.8763, 0.9070 ),
           float3( 0.6510, -0.6250, 0.9070 ),
           float3( 0.8668, 0.2513, 0.9070 )
       };

#endif
	float2	pixelSizeHigh;
	float2	pixelSizeLow;


	pixelSizeHigh.x = 1.000 / _c44.x;
	pixelSizeHigh.y = 1.000 / _c44.y;

	//pixelSizeHigh.x = 2.0 / _c44.x;
	//pixelSizeHigh.y = 2.0 / _c44.y;

	pixelSizeHigh.xy *= PixelSizeMultiplier;

	pixelSizeLow.xy = pixelSizeHigh.xy;

	float2	vMaxCoC = float2(5.0, 10.0);

	float	radiusScale = BlurIntensity;
	
	float	discRadius;
	float	discRadiusLow;
	float	centerDepth;
	float4	tdepth;

	float4  tapHigh;
	float4  tapLow;

	centerDepth = dist;
	
	discRadius = abs(centerDepth * vMaxCoC.y - vMaxCoC.x);
	discRadiusLow = discRadius * radiusScale;
	
	r1 = 0.0;

	for(int t = 0; t < DoF_TAPS; t++)
	{
	    float2  coordLow = _v0.xy + (pixelSizeLow.xy * poisson[t].xy * discRadiusLow);
	    float2  coordHigh = _v0.xy + (pixelSizeHigh.xy * poisson[t].xy * discRadius);

	    tapLow = tex2D(s2, coordLow.xy) * poisson[t].z;
	    tapHigh = tex2D(s2, coordHigh.xy) * poisson[t].z;

	    tdepth = tex2D(s1, coordHigh.xy); //GBufferTextureSampler3
	    tdepth.y = -_c77.x + _c77.y; //-dofProj.x + dofProj.y
	    tdepth.y = 1.0 / tdepth.y;
	    tdepth.z = tdepth.y * _c77.y; //dofProj.y
	    tdepth.z = tdepth.z * -_c77.x; //dofProj.x
	    tdepth.x = _c77.y * -tdepth.y + tdepth.x;
	    tdepth.x = 1.0 / tdepth.x;

	    tdepth.w = tdepth.z * tdepth.x - _c78.w; //dofDist.w
	    tdepth.w += _c78.y * -r3.w; //dofDist.y
	    tdepth.w += 150;//offset

	    tdepth.w = max(tdepth.w, 0); //fix zoom bug

	    if(tdepth.w < vDofParams.y)
	        tapHigh.w = (tdepth.w - vDofParams.y)/(vDofParams.y - vDofParams.x);
	    else
	    {
	        tapHigh.w = (tdepth.w - vDofParams.y)/(vDofParams.z - vDofParams.y);
	        tapHigh.w = clamp(tapHigh.w, 0, vDofParams.w);
	    }

    	    tapHigh.w = tapHigh.w * 0.5 + 0.5;

	    tapLow.w = tapHigh.w;

	    float  tapBlur = abs(tapHigh.w * 2.0 - 1.0);
	    float4  tap = lerp(tapHigh, tapLow, tapBlur);

	    if(tap.w >= centerDepth)	tap.w = 1.0;
	    else	tap.w = abs(tap.w * 2.0 - 1.0);

	    r1.xyz += tap.xyz * tap.w;
	    r1.w += tap.w;


	}
	
	r1.xyz /= r1.w;	

#endif
#ifdef HQ_DOF
	r1.w=dot(r1.xyz, r1.xyz); //dp3
	r1.w=1.0/r1.w;

	//if (-r1.w<0.0) r3 = r1;
	//else r3 = _c0.x;

	r3 = lerp(_c0.x, r1, saturate(r1.w * 10000));

	r4 = r3;
	r5 = r3;
	r6 = r3;
	r7 = r3;
#endif
///////////////////////////////////////
///////////////////////////////////////
#ifdef LQ_DOF

float	MaxBlur = 1;
float	MinBlur = 0.25;

float2	center;
float	distance;
float	focus;
float	farblur;
float	dof;
float	centerdist;	
float	deltadist;

float	autofocus;

float	sampleradius = 0.01;
float	errorradius = 2;
float	blurradius = 20.0;

r3=_c4; //-0.5, -1.5, 1.5, 0.5

static float2 d_offset[60]=
{
float2( 0.2165, 0.1250 ),
float2( 0.0000, 0.2500 ),
float2( -0.2165, 0.1250 ),
float2( -0.1250, 1.0000 ),
float2( -0.0000, -0.2500 ),
float2( 0.1250, 1.0000 ),
float2( 0.4330, 1.0000 ),
float2( 0.0000, 0.5000 ),
float2( -0.4330, 1.0000 ),
float2( 0.4330, -1.0000 ),
float2( -0.5000, 1.0000 ),
float2( 0.4330, -0.2500 ),
float2( 0.6495, 0.3750 ),
float2( 0.0000, 0.7500 ),
float2( -0.6495, 0.3750 ),
float2( 0.6495, -0.3750 ),
float2( -0.7500, 1.0000 ),
float2( -0.3750, 1.0000 ),
float2( 0.8660, 0.5000 ),
float2( 1.0000, 1.0000 ),
float2( -0.8660, -0.5000 ),
float2( -0.8660, 0.5000 ),
float2( -1.0000, -1.0000 ),
float2( 0.8660, 1.0000 ),
float2( 0.2163, 0.3754 ),
float2( -0.2170, 0.8670 ),
float2( -0.4333, -0.0004 ),
float2( 0.2163, -0.8670 ),
float2( 0.2170, -0.3750 ),
float2( 0.4333, 0.0004 ),
float2( 0.4328, 0.5004 ),
float2( -0.2170, 0.6250 ),
float2( -0.6498, 0.1246 ),
float2( -0.5004, 0.8847 ),
float2( 0.2170, 0.8847 ),
float2( -0.1246, -0.8847 ),
float2( 0.6254, -0.9065 ),
float2( 0.8750, 0.9065 ),
float2( -0.8663, 0.9065 ),
float2( -0.6493, -0.6254 ),
float2( 0.2170, 0.9065 ),
float2( 0.8663, -0.9065 ),
float2( 0.6259, 0.8851 ),
float2( -0.4340, 0.8851 ),
float2( -0.6500, -0.1259 ),
float2( -0.6259, -0.8851 ),
float2( -0.5000, -0.8851 ),
float2( 0.6500, 0.1259 ),
float2( 0.7509, 0.1259 ),
float2( -0.4340, 0.8670 ),
float2( -0.8665, -0.0009 ),
float2( -0.7509, 0.8670 ),
float2( 0.4340, -0.7500 ),
float2( 0.0009, 0.8670 ),
float2( 0.2158, 0.9070 ),
float2( -0.6510, 0.9070 ),
float2( -0.2513, -0.9070 ),
float2( -0.8763, -0.9070 ),
float2( 0.6510, -0.6250 ),
float2( 0.2513, 0.9070 )
};


float distsum = 0;

for(int i=0; i < 25; i++)
{
   r0 = tex2D(s1, 0.5 + d_offset[i] * sampleradius);
   r0.y=-_c77.x + _c77.y; //-dofProj.x + dofProj.y
   r0.y=1.0/r0.y;
   r0.z=r0.y * _c77.y; //dofProj.y
   r0.z=r0.z * -_c77.x; //dofProj.x
   r0.x=_c77.y * -r0.y + r0.x;
   r0.x=1.0/r0.x;

   distance=r0.z * r0.x - _c78.w; //dofDist.w
   distance+=_c78.y * -r3.w; //dofDist.y
   distance+=140;//offset

   distsum += distance;
}

centerdist = distance;

distsum *= 0.04;
deltadist = abs(distsum - centerdist);


r0=tex2D(s1, _v0.xy); //GBufferTextureSampler3
r0.y=-_c77.x + _c77.y; //-dofProj.x + dofProj.y
r0.y=1.0/r0.y;
r0.z=r0.y * _c77.y; //dofProj.y
r0.z=r0.z * -_c77.x; //dofProj.x
r0.x=_c77.y * -r0.y + r0.x;
r0.x=1.0/r0.x;
r0.y=r0.z * r0.x;

r0.w=abs(_c79.w);


distance = r0.z * r0.x - _c78.w; //dofDist.w
distance += _c78.y * -r3.w; //dofDist.y
distance += 140;//offset

center.x = _v0.x-0.5;
center.y = 0.5-_v0.y;
focus = length(center.xy)*1.41421;
focus = pow(focus,2);
focus *= MaxBlur;

farblur = saturate((distance - 25)*0.0025) * 0.1;

if(distance < 25)
{
   farblur = 1;
   dof = MinBlur;
}
else dof = MaxBlur;

blurradius = 1 / blurradius;

if(deltadist < errorradius)
{
   dof = MaxBlur;
   autofocus = abs(distance - centerdist);
   autofocus = saturate(autofocus * blurradius);
}
else   autofocus = farblur;

if(centerdist > 50) autofocus = farblur;


//TEMP decrease bluriness for edge smoothing
float2 off_c76 = _c76.xy * min(dof + focus, MaxBlur); 


r1=tex2D(s2, _v0.xy); //HDRSampler
r2=tex2D(s3, _v0.xy); //BloomSampler

float2 tempuvx=0.0;


//r3=float4(-0.5, -1.5, 1.5, 0.5);
//-0.5, -1.5
//-0.5, 1.5
// 1.5, 0.5
//-1.5, 0.5


float4 r12=r3;
r4.xy=off_c76.xy * r3.xy + _v0.xy; //TexelSize.xy
r4=tex2D(s2, r4.xy); //HDRSampler
r4=0.5*(r4 + tex2D(s2, _v0.xy + 1*off_c76.xy * reflect(r12.xy, normalize(float3(sin(0.7853981634*2), cos

(0.7853981634*2), 0.0)))) );

r5.xy=off_c76.xy * r3.zx + _v0.xy; //TexelSize.xy
r5=tex2D(s2, r5.xy); //HDRSampler
r5=0.5*(r5 + tex2D(s2, _v0.xy + 1*off_c76.xy * reflect(r12.zx, normalize(float3(sin(0.7853981634*2), cos

(0.7853981634*2), 0.0)))) );

r3.xz=off_c76.xy * r3.wz + _v0.xy; //TexelSize.xy
r6=tex2D(s2, r3.xz); //HDRSampler
r6=0.5*(r6 + tex2D(s2, _v0.xy + 1*off_c76.xy * reflect(r12.wz, normalize(float3(sin(0.7853981634*2), cos

(0.7853981634*2), 0.0)))) );

//r3.xy=off_c76.xy * r3.yw + _v0;	//TexelSize.xy
r3.xy=_c76.xy * r3.yw*(0.2+1.0) + _v0;	
r7=tex2D(s2, r3.xy); //HDRSampler
r7=0.5*(r7 + tex2D(s2, _v0.xy + 1*off_c76.xy * reflect(r12.yw, normalize(float3(sin(0.7853981634*2), cos

(0.7853981634*2), 0.0)))) );
	r1.w=dot(r4.xyz, r4.xyz);
	r1.w=1.0/r1.w;
	if (-r1.w<0.0)
	{
		r3.xyz=r4.xyz;
	} else r3.xyz=_c0.x;

	r1.w=dot(r5.xyz, r5.xyz); //dp3
	r1.w=1.0/r1.w;
	if (-r1.w<0.0)
	{
		r4.xyz=r5.xyz;
	} else r4.xyz=_c0.x;

	r1.w=dot(r6.xyz, r6.xyz); //dp3
	r1.w=1.0/r1.w;
	if (-r1.w<0.0)
	{
		r5.xyz=r6.xyz;
	} else r5.xyz=_c0.x;

	r1.w=dot(r7.xyz, r7.xyz); //dp3
	r1.w=1.0/r1.w;
	if (-r1.w<0.0)
	{
		r6.xyz=r7.xyz;
	} else r6.xyz=_c0.x;

	r1.w=dot(r1.xyz, r1.xyz); //dp3
	r1.w=1.0/r1.w;
	if (-r1.w<0.0)
	{
		r7.xyz=r1.xyz;
	} else r7.xyz=_c0.x;

#endif

///////////////////////////////////////
///////////////////////////////////////
	r0.x=r0.z * r0.x - _c78.w; //dofDist.w
	r0.x=_c78.y * -r3.w + r0.x; //dofDist.y
	r1.w=max(r0.x, _c0.x); //0.0
	r0.x=1.0/_c78.z; //dofDist.z
	r0.x=r1.w * r0.x;
	r1.w=lerp(_c79.y, _c79.z, r0.x);//dofBlur
	r0.x=min(_c79.z, r1.w); //dofBlur.z

	r0.z=dot(r7.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
	r8.x=dot(r3.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
	r8.y=dot(r4.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
	r8.z=dot(r5.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
	r8.w=dot(r6.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
	r1.w=dot(r8, _c1.xxxx); //0.25

	r8=r8 - r1.w;
	r2.w=dot(r8, r8);
	r0.z=r0.z - r1.w;
	r0.z=r0.z * r0.z - r2.w;
	r0.x=r0.x*r0.x;
	if (r0.z<0.0)
	{
		r0.x=r0.x;
	} else r0.x=_c1.y; //1.0


	r8=tex2D(s0, _v0.xy); //GBufferTextureSampler2


	r8.yz=_c1.yz; // 1.0, 256.0
	r9=r8.w * -r8.z + _c2; //0, 2, 4, 8
	if (r9.w<0.0) //r9<0.0
	{
		r9=_c1.w; //0.0
	} else r9=_c1.y; //1.0


	//r10=r8.w + tempc6;//c6.yzwx; //256, 2, 4, 8
	r10=r8.w * -_c6.x + _c6.yzwx; //256, 2, 4, 8


	if (r10.x<0.0)
	{
		r10.x=-_c1.w; //0.0
	} else r10.x=-_c1.y; //1.0

	if (r10.y<0.0)
	{
		r10.y=-_c1.w; //0.0
	} else r10.y=-_c1.y; //1.0

	if (r10.z<0.0)
	{
		r10.z=-_c1.w; //0.0
	} else r10.z=-_c1.y; //1.0

	if (r10.w<0.0)
	{
		r10.w=-_c1.w; //0.0
	} else r10.w=-_c1.y; //1.0


	r9=r9 + r10;
	r9=r9 * _c4.x; //-0.5


	r0.z=dot(r9, _c1.yyyy); //1.0
	r0.z=r0.z + _c4.w; //0.5
	r0.z=1.0/r0.z;
	r8.xzw=r3.xyz * r9.x;


	r7.xyz=r7 * _c4.w + r8.xzw; //0.5
	r7.xyz=r4 * r9.y + r7;
	r7.xyz=r5 * r9.z + r7;
	r7.xyz=r6 * r9.w + r7;
	r7.xyz=r0.z * r7;
	r0.z=-r0.x + _c1.y; //1.0
	r1.w=r0.x * _c1.x; //0.25


	r3.xyz=r3 * r1.w;
	r3.xyz=r7 * r0.z + r3;
	r3.xyz=r4 * r1.w + r3;
	r3.xyz=r5 * r1.w + r3;
	r3.xyz=r6 * r1.w + r3;


	//r4.xyz=_v0.yxy * _c5.x + _c5.y; //2, -1
	r4.x=_v0.y * _c5.x + _c5.y;
	r4.y=_v0.x * _c5.x + _c5.y;
	r4.z=_v0.y * _c5.x + _c5.y;


r0.z=r4.y * _c77.z; //dofProj.z
r0.z=r0.y * r0.z;
r1.w=-r4.x * _c77.w; //dofProj.w
r1.w=r0.y * r1.w;
r5.xyz=r1.w * _c73; //motionBlurMatrix.2
r5.xyz=r0.z * _c72 + r5; //motionBlurMatrix.1
r5.xyz=-r0.y * _c74 + r5; //motionBlurMatrix.3
r5.xyz=r5 + _c75; //motionBlurMatrix.4

r0.y=-r5.z * _c77.z; //dofProj.z
r0.y=1/r0.y;
r6.x=r5.x * r0.y;
r0.y=r5.z * _c77.w; //dofProj.w
r0.y=1/r0.y;
r6.y=r5.y * r0.y;
//r0.yz=-r4 + r6.xxyw;
r0.yz=-r4.yz + r6.xy;

//r0.yz=r0 * _c80.x; //gDirectionalMotionBlurLength.x
r0.y=r0.y * _c80.x;
r0.z=r0.z * _c80.x;
r4.xy=r0.yz * _c5.z; //0.125
r5=tex2D(s6, _v0.xy); //StencilCopySampler
r1.w=r5.x - _c85.x; //PLAYER_MASK.x
r4.zw=r3.xy * _c2.w; //8.0
r4.zw=_v0.xy * _c3.xy + r4.zw; //58.1640015, 47.1300011
r5=tex2D(s5, r4.zw); //JitterSampler
//r2.w=r5.x - 0.5; //-0.5
r4.zw=r4.xy * (r5.x - 4) + _v0.xy; //0.082 fixed
r5.xyz=r3.xyz;
r2.w=_c1.y; //1.0
r3.w=_c1.y; //1.0

for (int iii=0; iii<5; iii++)
{
r6.x=r4.x * r3.w + r4.z;
r6.y=r4.y * r3.w + r4.w;
 r7=tex2D(s6, r6.xy);
 r5.w=r7.x - _c85.x;
 if (r5.w<-0.3)
 {
 	r5.w=_c1.y; //1.0
 } else r5.w=_c1.w; //0.0
 r6=tex2D(s2, r6.xy);
 r5.xyz=r6.xyz * r5.w + r5.xyz;
 r2.w=r2.w + r5.w;
 r3.w=r3.w + _c1.y; //1.0
}



	r2.w=1.0/r2.w;

	//r0.yz=r0 * _c44.xxyw; //globalScreenSize
	r0.y=r0.y * _c44.x; //globalScreenSize
	r0.z=r0.z * _c44.y; //globalScreenSize

	r0.y=dot(r0.yz, r0.yz)+_c0.x;//dp2

	//r0.y=sqrt(r0.y);
	//r0.y=1.0/r0.y;
	r0.y=pow(r0.y, _c4.w); //0.5

	r0.y=r0.y * _c4.w; //0.5
	r0.x=r0.x + _c1.y; //1.0
	r0.x=1.0/r0.x;
	//r0.y is wrong
	r0.x=saturate(r0.y * r0.x);
	r4.xyz=r5 * r2.w - r3;
	r0.xyz=r0.x * r4 + r3;

	//_oC0.xyz=0.5*r0.xyz;

	if (-r1.w<0.0) r0.xyz=r3.xyz;
	if (-r0.w<0.0) r0.xyz=r1.xyz;

r11=r0;



	r1=tex2D(s4, _c0.x); //AdapLumSampler , 0.0
	r0.w=1.0/r1.x;
	r0.w=r0.w * _c81.y; //ToneMapParams.y
	r1.x=1.0/r0.w;
	r1.x=r1.x * _c81.x; //ToneMapParams.x
	r1.xyz=r2 * _c66.x - r1.x; //Exposure.x
	r2.xyz=max(r1, _c0.x); //0.0
	r1.xyz=r2 * _c81.z; //ToneMapParams.z
	r1.xyz=r1 * _c1.x; //0.25
	r0.xyz=r0 * _c66.x + r1; //Exposure.x
	r1.xyz=r0.w * r0;
	r1.x=dot(r1.xyz, _c0.yzw); //0.2125, 0.7154, 0.0721
	r0.xyz=r0 * r0.w - r1.x;
	r0.xyz=_c82.x * r0 + r1.x; //deSatContrastGamma.x
	r0.w=r1.x * _c84.w; //ColorShift.w
	r1.yzw=r0.w * _c84.xxyz; //ColorShift


	//darken as DarkeningAmount, but keeps colors
	r2.x=saturate(r0.w);
	r0.xyz=r0.xyz - _c84.xyz * r0.w; //ColorShift
	r0.xyz=r2.x * r0.xyz + r1.yzww;

	//coloring (green, brown, ...)
	r0.xyz=2.0 * r0.xyz * _c83.xyz; //ColorCorrect

	//keeps colors, changes luma
	r1.x=saturate(r1.x);
	r0.w=_c82.z - r8.y; //deSatContrastGamma.z
	r2.x=pow(r1.x, r0.w);

	_oC0.xyz=r0.xyz * r2.x; //orig
	_oC0.w=_c1.y; //1.0

r5=tex2D(s4, _c0.x);//adaptation luminance
r0=tex2D(s2, _v0.xy);

#ifdef LQ_DOF
r11.xyz = lerp(r0.xyz, r11.xyz, autofocus);
#endif

r0=r11;



r5.w=r5.x;
r5.w=AdaptationValue/r5.w;
r0.xyz=r0 * r5.w;
r3.xy=_c10.xwxw;
r3.xy=r3.xy * r5.w;
float4 dirtPaletteTex=tex2D(s13, _v0.xy);
float4 uvsrc=0.0;
float3 lensDirt=dirtPaletteTex.xyz; 
r7=tex2D(s3, _v0.xy);
#ifdef BLOOM_DISTORTION
r7.r=tex2D(s3, _v0.xy + BloomDAmount * -0.01).x;
r7.g=tex2D(s3, _v0.xy + BloomDAmount * 0).y;
r7.b=tex2D(s3, _v0.xy + BloomDAmount * 0.01).z;
r7 = r5.w * r7;
#else
float4 r7 = tex2D(s3, _v0.xy);
#endif	
r7.xyz+=r7.xyz*lensDirt.xyz*DirtyLensEffect;
//0.15 is bloom
r0=r7 * BloomAdditive + r0; //0.05 //TEMP DISABLED
r10=dot(r0.xyz, _c12.xyz);
r9.x=r10.x * 1.50;//c199.x;
r10.x=1.0/r10.x;
r10=r10 * r9.x;
r0=r0 * r10.x;
r0=r0 * _c7.y; 

r1=r0 * _c7.z;
r1=r1 + _c7.w;
r1.xyz=1.0/r1.xyz;
r0=r0 * r1;


//float lumasat=dot(r0.xyz,_c12.xyz);
float gris=dot(r0.xyz, 0.333);
float3 SaturatedColor=pow(r0.xyz, Saturation);
float Niveaudegris=dot(SaturatedColor.xyz, 0.333);
float3 Resultat=SaturatedColor.xyz*gris/(Niveaudegris+0.0001);
float4 Mix=lerp(1, 0.75, saturate(pow(depth/1000.0, 1)));
r0.xyz = pow(Resultat,Mix);


//#define CROSSPROCESS
#ifdef CROSSPROCESS
float Weight;
float fRatio = 0.5;
float moodR = 0.33;
float moodG = 0.35;
float moodB = 0.4;
float4 colInput = r0;
float4 colMood = 1.0f;
colMood.r = moodR;
colMood.g = moodG;
colMood.b = moodB;
float fLum = ( colInput.r + colInput.g + colInput.b ) / 3;
colMood = lerp(0, colMood, saturate(fLum * 2.0));
colMood = lerp(colMood, 1, saturate(fLum - 0.5) * 2.0);
float4 colOutput = lerp(colInput, colMood, saturate(fLum * fRatio));
r0.rgb=max(0, colOutput);
r0.a=1.0;
#endif

#ifdef BLEACH
float	luma = dot(r0.xyz, _c12.xyz);
float3	blend = luma.xxx;
float	L = min(1, max(0, 10*(luma - 0.45)));
float3 result1 = 2.0 * r0.xyz * blend;
float3 result2 = 1.0 - 2.0*(1.0 - blend)*(1.0 - r0.xyz);
float3 newColor = lerp(result1.xyz, result2.xyz, L);
float3 mixRGB = BP_factor * newColor.xyz;
mixRGB += ((1.0f - BP_factor) * r0.xyz);
r0.xyz = mixRGB;
#endif


r0.xyz = lerp(r0.xyz, 0.5 * (1 + sin((r0.xyz - 0.5)*3.1415926)), AddContrast);
r0=BloomAmountMix*r7 * r3.x + r0;


#ifdef BLACKBARS
//Vignette code from hd7


float rovigpwr = 0; //for a circular vignette
float2 sqvigpwr = float2( 1.5, 1.5 ); // for the top and bottom of the screen
float vsatstrength = 0; // color distortion
float vignettepow = 0; // increases the contrast and sharpness
float vstrengthatnight = 7.5;

 float2 inTex = _v0; 
float vhnd = 0.5;
 float4 voriginal = r0;
 float4 vcolor = voriginal;
 vcolor.xyz=1;
 inTex -= 0.5; // center
 inTex.y += 0.01; // offset from the center
 float vignette = 1.0 - dot( inTex, inTex );
 vcolor *= pow( vignette, vignettepow );

 float4 rvigtex = vcolor;
 rvigtex.xyz = pow( vcolor, 1 );
 rvigtex.xyz = lerp(float3(0.5, 0.5, 0.5), rvigtex.xyz, 2.0); // contrast
 rvigtex.xyz = lerp(float3(1,1,1),rvigtex.xyz,rovigpwr); // strength of the circular vinetty

//darken the top and bottom
 float4 vigtex = vcolor;
 vcolor.xyz = float3(1,1,1);
 float3 topv = min((inTex.y+0.5)*2,1.5) * 2; // top
 float3 botv = min(((0-inTex.y)+0.5)*2,1.5) * 2; // botton
 topv= lerp(float3(1,1,1), topv, sqvigpwr.x);
 botv= lerp(float3(1,1,1), botv, sqvigpwr.y);
 vigtex.xyz = (topv)*(botv);
 //vigtex.xyz = lerp(float3(1,1,1),vigtex.xyz,sqvigpwr); // strength of the top and bottom

 // mix the two types of vignettes
 vigtex.xyz*=rvigtex.xyz; 
vigtex.xyz = lerp(vigtex.xyz,float3(1,1,1),(1-vstrengthatnight)*(1-vhnd)); //for a dark screen
 vigtex.xyz = min(vigtex.xyz,1);
 vigtex.xyz = max(vigtex.xyz,0);
 float3 vtintensity = dot(r0.xyz, float3(0.2125, 0.7154, 0.0721));
 r0.xyz = lerp(vtintensity, r0.xyz, ((((1-(vigtex.xyz*2))+2)-1)*vsatstrength)+1 );
 //color.xyz+=0.02;
 r0.xyz *= (vigtex.xyz);
#endif

//#define VIGNETTE
#ifdef VIGNETTE
float rovigpwr = 0.75; //for a circular vignette
float2 sqvigpwr = float2( 0.5, 0.5 ); // for the top and bottom of the screen
float vsatstrength = 1; // color distortion
float vignettepow = 1; // increases the contrast and sharpness
float vstrengthatnight = 10.25;
 float2 inTex = _v0; 
 float vhnd = 0.5;
 float4 voriginal = r0;
 float4 vcolor = voriginal;
 vcolor.xyz=1;
 inTex -= 0.5; // center
 inTex.y += 0.01; // offset from the center
 float vignette = 1.0 - dot( inTex, inTex );
 vcolor *= pow( vignette, vignettepow );
 float4 rvigtex = vcolor;
 rvigtex.xyz = pow( vcolor, 1 );
 rvigtex.xyz = lerp(float3(0.5, 0.5, 0.5), rvigtex.xyz, 2.0); // contrast
 rvigtex.xyz = lerp(float3(1,1,1),rvigtex.xyz,rovigpwr); // strength of the circular vinetty
 float4 vigtex = vcolor;
 vcolor.xyz = float3(1,1,1);
 float3 topv = min((inTex.y+0.5)*2,1.5) * 2; // top
 float3 botv = min(((0-inTex.y)+0.5)*2,1.5) * 2; // botton
 topv= lerp(float3(1,1,1), topv, sqvigpwr.x);
 botv= lerp(float3(1,1,1), botv, sqvigpwr.y);
 vigtex.xyz = (topv)*(botv);
 vigtex.xyz*=rvigtex.xyz; 
vigtex.xyz = lerp(vigtex.xyz,float3(1,1,1),(1-vstrengthatnight)*(1-vhnd)); //for a dark screen
 vigtex.xyz = min(vigtex.xyz,1);
 vigtex.xyz = max(vigtex.xyz,0);
 float3 vtintensity = dot(r0.xyz, float3(0.2125, 0.7154, 0.0721));
 r0.xyz = lerp(vtintensity, r0.xyz, ((((1-(vigtex.xyz*2))+2)-1)*vsatstrength)+1 );
 r0.xyz *= (vigtex.xyz);
#endif


focus = length(center.xy)*1.41421;
focus = pow(focus, 4);
//#define FOG
#ifdef FOG
r0 = addFog(_v0.xyz,r0);
r0 = addIngame(_v0.xyz,r0);
#endif
r0.xyz -= focus * Vignetting;

_oC0.xyz=r0.xyz;


//_oC0=0.077*tex2D(s15, _v0.xy);//s2



//_oC0.xyz=1.0;






	//_oC0.w=1.0;
	return _oC0;
}


//mine temporary post process
technique Shader_C215BE6E
{
    pass p0 
    {
		PixelShader  = compile ps_3_0 PS_C215BE6E();
	}
}