   /*-----------------------------------------------------------.   
  /                 Defining constants                          /
  '-----------------------------------------------------------*/

//These values are normally defined by the injector dlls, but not when anylyzed by GPU Shaderanalyzer
//I need to ensure they always have a value to be able to compile them whenever I'm not using the injector.
#ifdef SMAA_PIXEL_SIZE
  #ifndef BUFFER_RCP_WIDTH
    #define BUFFER_RCP_WIDTH SMAA_PIXEL_SIZE.x
    #define BUFFER_RCP_HEIGHT SMAA_PIXEL_SIZE.y
    #define BUFFER_WIDTH (1.0 / SMAA_PIXEL_SIZE.x)
    #define BUFFER_HEIGHT (1.0 / SMAA_PIXEL_SIZE.y)
  #endif
#endif

#ifndef BUFFER_RCP_WIDTH
  #define BUFFER_RCP_WIDTH (1.0 / 1680)
  #define BUFFER_RCP_HEIGHT (1.0 / 1050)
  #define BUFFER_WIDTH 1680
  #define BUFFER_HEIGHT 1050
#endif

#define screen_size float2(BUFFER_WIDTH,BUFFER_HEIGHT)

#define px BUFFER_RCP_WIDTH
#define py BUFFER_RCP_HEIGHT

#define pixel float2(px,py)

// -- Define DirectX9 specific aliases --
#if SMAA_HLSL_3 == 1
  #define myTex2D(s,p) tex2D(s,p)
  
  #define s0 colorTexG
  #define s1 colorTexG //TODO make a nearest sampler if needed
#endif

// -- Define DirectX10/11 specific aliases --
#if SMAA_HLSL_4 == 1 || SMAA_HLSL_4_1 == 1
  #define myTex2D(s,p) s.SampleLevel(LinearSampler, p, 0)

  #define s0 colorTexGamma
  #define s1 colorTexGamma //TODO make a nearest sampler if needed
#endif

   /*-----------------------------------------------------------.   
  /                 Including enabled shaders                   /
  '-----------------------------------------------------------*/


#if (USE_LUMASHARPEN == 1)
    #include "SweetFX\Shaders\LumaSharpen.h"
#endif

#if (USE_HDR == 1)
    #include "SweetFX\Shaders\HDR.h"
#endif

#if (USE_BLOOM == 1)
    #include "SweetFX\Shaders\Bloom.h"
#endif

#if (USE_TECHNICOLOR == 1)
    #include "SweetFX\Shaders\Technicolor.h"
#endif

#if (USE_DPX == 1)
    #include "SweetFX\Shaders\DPX.h"
#endif

#if (USE_LIFTGAMMAGAIN == 1)
	#include "SweetFX\Shaders\LiftGammaGain.h"
#endif

#if (USE_TONEMAP == 1)
    #include "SweetFX\Shaders\Tonemap.h"
#endif

#if (USE_SEPIA == 1)
    #include "SweetFX\Shaders\Sepia.h"
#endif

#if (USE_VIBRANCE == 1)
    #include "SweetFX\Shaders\Vibrance.h"
#endif

#if (USE_CURVES == 1)
    #include "SweetFX\Shaders\Curves.h"
#endif

#if (USE_VIGNETTE == 1)
    #include "SweetFX\Shaders\Vignette.h"
#endif

#if (USE_DITHER == 1)
    #include "SweetFX\Shaders\Dither.h"
#endif

#if (USE_SPLITSCREEN == 1)
    #include "SweetFX\Shaders\Splitscreen.h"
#endif


   /*-----------------------------------------------------------.   
  /                        Effect passes                        /
  '-----------------------------------------------------------*/

float4 main(float2 tex, float4 FinalColor)
{
//    FinalColor.rgb = (FinalColor.rgb <= 0.03928) ? FinalColor.rgb / 12.92 : pow( (FinalColor.rgb + 0.055) / 1.055, 2.4 ); // SRGB to Linear


    // Linear to SRGB gamma correction. Needed here because SMAA uses linear for it's final step while the other shaders use SRGB.
    #if (USE_SMAA_ANTIALIASING == 1)
    FinalColor.rgb = (FinalColor.rgb <= 0.00304) ? FinalColor.rgb * 12.92 : 1.055 * pow( FinalColor.rgb, 1.0/2.4 ) - 0.055; // Linear to SRGB
	#endif

	// LumaSharpen (has to be the first pass because it samples multiple texels)
    #if (USE_LUMASHARPEN == 1)
		FinalColor = LumaSharpenPass(FinalColor,tex);
	#endif
	
	// Bloom
    #if (USE_BLOOM == 1)
		FinalColor = BloomPass (FinalColor,tex);
	#endif
	
	// HDR
    #if (USE_HDR == 1)
		FinalColor = HDRPass (FinalColor,tex);
	#endif
	
	// Technicolor
    #if (USE_TECHNICOLOR == 1)
		FinalColor = TechnicolorPass(FinalColor);
	#endif
	
	// DPX
    #if (USE_DPX == 1)
		FinalColor = DPXPass(FinalColor);
	#endif
	
	// Lift Gamma Gain
    #if (USE_LIFTGAMMAGAIN == 1)
		FinalColor = LiftGammaGainPass(FinalColor);
	#endif
	
	// Tonemap
	#if (USE_TONEMAP == 1)
		FinalColor = TonemapPass(FinalColor);
	#endif
	
	// Vibrance
	#if (USE_VIBRANCE == 1)
		FinalColor = VibrancePass(FinalColor);
	#endif
	
	// Curves
	#if (USE_CURVES == 1)
		FinalColor = CurvesPass(FinalColor);
	#endif
	
	// Sepia
	#if (USE_SEPIA == 1)
    FinalColor = SepiaPass (FinalColor);
	#endif
	
	// Vignette
	#if (USE_VIGNETTE == 1)
		FinalColor = VignettePass(FinalColor,tex);
	#endif

	// Dither (should go last as it only dithers what went before it)
	#if (USE_DITHER == 1)
		FinalColor = DitherPass(FinalColor,tex);
	#endif
	
	// Splitscreen
	#if (USE_SPLITSCREEN == 1)
		FinalColor = SplitscreenPass(FinalColor,tex);
	#endif
	
  // SRGB to Linear gamma correction. (Hmm should this go after Dither? .. TODO: investigate)
  #if (USE_SMAA_ANTIALIASING == 1 && SMAA_HLSL_3 != 1) //Only for DirectX 10/11
    FinalColor.rgb = (FinalColor.rgb <= 0.03928) ? FinalColor.rgb / 12.92 : pow( (FinalColor.rgb + 0.055) / 1.055, 2.4 ); // SRGB to Linear
	#endif



	// Return FinalColor
	return FinalColor;
}
