//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//ENBSeries: boris-vorontsov@yandex.ru, boris-vorontsov.narod.ru
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
THIS IS HLSL (HIGH LEVEL SHADER LANGUAGE) FILE FOR EXECUTING ADDITIONAL
HARDWARE EFFECTS. MAKE THE COPY BEFORE CHANGING IT!
*/

//+---------------------------------------------------------------------+
//|OBLIVION EFFECT                                   			|
//+---------------------------------------------------------------------+
//|FOR ENBSeries Indonesian Group                      			|
//+---------------------------------------------------------------------+
//|CODES AND SHADERS DECOMPILED BY BORIS VORONTSOV                	| 
//|MODIFIER BY J3SMOOVE              					|
//+---------------------------------------------------------------------+

//FOR Manual Settings BLUR and Color
Float	AmountBLUR= 0.2;
Float	AmountGammaBrightness= 1.05;
Float	AmountDarkening= 0.65;

//keyboard controled variables
float	tempF1;
float	tempF2;
float	tempF3;
float	tempF4;
float	tempF5;
float	tempF6;
float	tempF7;
float	tempF8;
float	tempF9;
float	tempF0;


//global variables, already set before executing this code
float	ScreenSize;	//width of the display resolution (1024 f.e.)
float	ScreenScaleY;	//screen proportions (1.333 for 1024/768)
float	ScreenBrightnessAdaptation;//(-10..10) for bloom it controls how much to dark in the night or when scene is dark (user defined constant factor)
float	bloomPower;//(0..10) actually used for bloom, but may be useful here (user defined constant factor)
float	useBloom;//(0 or 1) if bloom enabled by user



//textures
texture2D texColor;

sampler2D SamplerColor = sampler_state
{
	Texture   = <texColor>;
	MinFilter = LINEAR;
	MagFilter = LINEAR;
	MipFilter = NONE;//NONE;
	AddressU  = Clamp;
	AddressV  = Clamp;
	SRGBTexture=FALSE;
};

struct VS_OUTPUT_POST {
	float4 vpos  : POSITION;
	float2 txcoord : TEXCOORD0;
};

struct VS_INPUT_POST {
	float3 pos  : POSITION;
	float2 txcoord : TEXCOORD0;
};




//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VS_OUTPUT_POST VS_PostProcess(VS_INPUT_POST IN)
{
	VS_OUTPUT_POST OUT;

	float4 pos=float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);

	OUT.vpos=pos;
	OUT.txcoord.xy=IN.txcoord.xy;

	return OUT;
}




float4 PS_PostProcess(VS_OUTPUT_POST In) : COLOR
{
/*
float	tempF1=1.0;
float	tempF2=1.0;
float	tempF3=1.0;
float	tempF4=1.0;
float	tempF5=1.3;
float	tempF6=4.35;
float	tempF7=1.12;
float	tempF8=1.2;
float	tempF9=3.17;
float	tempF0=1.4;
*/
//START TO MAKE YOUR CHANGES FROM HERE
	float4 res;
	float4 uvsrc=0;
	uvsrc.xy=In.txcoord;


	float2 offset[8]=
	{
		float2(-1.0,-1.0),
		float2(-1.0, 1.0),
		float2( 1.0, 1.0),
		float2( 1.0,-1.0),
		float2( 0.0, 1.41),
		float2( 0.0,-1.41),
		float2(-1.41, 0.0),
		float2( 1.41, 0.0)
	};
	res=0.0;
	float4 coord=0.0;
	coord.xy=In.txcoord.xy;
	float4 origcolor=tex2D(SamplerColor, coord.xy);
	float origgray=max(origcolor.r, max(origcolor.g, origcolor.b));
	res+=origcolor;
	float range=AmountBLUR*tempF1/ScreenSize;
	for (int i=0; i<8; i++)
	{

		coord.xy=In.txcoord+offset[i]*range;
		float4 color;
		float gray;
		color=tex2D(SamplerColor, coord.xy);
		float4 colordiff=abs(origcolor-color);
		gray=dot(colordiff.rgb,0.333);
		float lerpfact=saturate(4.0*abs(gray)*color.a);//saturate
		res+=lerp(origcolor, color, lerpfact);
	}
	res=res*0.11;



	float4 color=res;	//tex2Dbias(SamplerColor, uvsrc);

	float	tf7=tempF7*AmountGammaBrightness;
	float	tf8=tempF8*AmountDarkening;

	float3 correctedcolor=saturate((1.0-color*tempF9*0.24)*tempF0*0.16);

	res.rgb=saturate(color.rgb-correctedcolor);
	res.rgb=pow(res.rgb,tf8)*tf7;

	res.a=0.8;
	return  res;
}







//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
technique PostProcess
{
    pass P0
    {
	VertexShader = compile vs_2_0 VS_PostProcess();
	PixelShader  = compile ps_2_a PS_PostProcess();

	FogEnable=FALSE;
	ALPHATESTENABLE=FALSE;
	SEPARATEALPHABLENDENABLE=FALSE;
	AlphaBlendEnable=FALSE;
	FogEnable=FALSE;
	SRGBWRITEENABLE=FALSE;
	}
}

