#pragma once

#include <vector>
#include "Mix/Private/Scene/Standard/Common/Renderer.h"

namespace Mix{ namespace Scene{ namespace Standard{ namespace DX11{

	class Renderer : public Mix::Scene::Standard::Common::Renderer
	{
	private:
		//バーテックスシェーダーコンスタントレジスタ列挙定数
		enum VSCR
		{
			VSCR_GENERAL		= 1,	//全般
			VSCR_TRANSFORM		= 2,	//トランスフォーム

			VSCR_SKYDOME		= 0,	//スカイドーム
			VSCR_PANORAMA		= 0,	//スカイドーム : パノラマ

			VSCR_GAUSSIAN_BLUR	= 0,	//ガウシンアブラー
		};

		//ピクセルシェーダーコンスタントレジスタ列挙定数
		enum PSCR
		{
			PSCR_GENERAL			= 1,	//全般
			PSCR_LOCALLIGHT			= 2,	//ローカルライト
			PSCR_MATERIAL			= 3,	//マテリアル( シャドウと弁用 )

			PSCR_SKYDOME			= 0,	//スカイドーム
			PSCR_PANORAMA			= 0,	//スカイドーム : パノラマ

			PSCR_SAMPLING			= 0,	//サンプリング
			PSCR_BLUR				= 0,	//ブラー
			PSCR_GAUSSIAN_BLUR		= 0,	//ガウシアンブラー
			PSCR_GAUSSIAN_BLUR_EX	= 0,	//ガウシアンブラーEX

			PSCR_SM					= 0,	//シャドウマッピング
			PSCR_SSAO				= 0,	//SSAO
			PSCR_LUM_TRANSFORM		= 0,	//輝度 : トランスフォーム
			PSCR_LUM_ADAPTED		= 0,	//輝度 : アダプテッド
			PSCR_LUM_OPERATOR		= 0,	//輝度 : オペレーター
			PSCR_BRIGHT_PASS		= 0,	//ブライトパス
			PSCR_UNDERWATER			= 0,	//水面下ポストエフェクト
			PSCR_LS_INIT			= 0,	//ライトシャフト : 初期化
			PSCR_LS_BLUR			= 0,	//ライトシャフト : ブラー
			PSCR_LF_IMAGE			= 0,	//レンズフレア : イメージ
			PSCR_LF_MODIFY			= 0,	//レンズフレア : モディファイ
			PSCR_FILMIC				= 0,	//フィルミック
			PSCR_CA_IMAGE			= 0,	//色収差 : イメージ
			PSCR_CA_FINISH			= 0,	//色収差 : フィニッシュ
			PSCR_GAMMA_CORRECT		= 0,	//ガンマ補正
			PSCR_CAM_MOT_BLUR		= 0,	//カメラモーションブラー
			PSCR_DOF				= 0,	//被写界深度
			PSCR_LENS_DIST			= 0,	//歪曲収差
			PSCR_VIGNETTE			= 0,	//ヴィネット
			PSCR_FXAA				= 0,	//FXAA
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// レンダリング定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		struct VSC_RENDERRING
		{
			Mix::Matrix4x4 viewMat;			//カメラ( View )
			Mix::Matrix4x4 viewProjMat;		//カメラ( ViewProj )
			Mix::Matrix4x4 lightMat;		//シャドウ( Light )
			Mix::Matrix4x4 lightBiasMat;	//シャドウ( LightBias )
		};

		//PS
		struct PSC_RENDERRING
		{
			Mix::Vector4 camParam;									//カメラ( XYZ=eyePos W=invFarZ )
			Mix::Vector4 ambientColor;								//アンビエントカラー( XYZ=RGB )
			Mix::Vector4 hsParam;									//半球ライト( XYZ=Axis W=Enabled )
			Mix::Vector4 hsGroundColor;								//半球ライト( XYZ=GroundColor W=Intensity )
			Mix::Vector4 hsSkyColor;								//半球ライト( XYZ=SkyColor W=Intensity )
			Mix::Vector4 sunParam;									//平行光源ライト( XYZ=Dir W=Enabled )
			Mix::Vector4 sunColor;									//平行光源ライト( XYZ=Color W=Intensity )
			Mix::Vector4 fogParam;									//フォグ( X=p0 Y=p1 Z=Enabled )
			Mix::Vector4 fogColor;									//フォグ( XYZ=色 )
			Mix::Vector4 shadowParam0;								//シャドウ( X=DepthBias Y=DepthBiasSlopeScale Z=DepthBiasClamp W=Enabled )
			Mix::Vector4 shadowParam1;								//シャドウ( XY=テクスチャサイズ ZW=テクセルサイズ )
			Mix::Vector4 asColor;								    //大気散乱シミュレーション( XYZ=Color )
			Mix::Vector4 asSunDir;								    //大気散乱シミュレーション( XYZ=SunDirection )
			Mix::Vector4 asMultipliers;								//大気散乱シミュレーション( X=Lin YZW=Fex )
			Mix::Vector4 asHG;										//大気散乱シミュレーション( XYZ=HG )
			Mix::Vector4 asBetaDashR;								//大気散乱シミュレーション( XYZ=BetaDashR )
			Mix::Vector4 asBetaDashM;								//大気散乱シミュレーション( XYZ=BetaDashM )
			Mix::Vector4 asBetaRM;									//大気散乱シミュレーション( XYZ=BetaRM )
			Mix::Vector4 asOneOverBetaRM;							//大気散乱シミュレーション( XYZ=OneOverBetaRM )
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// トランスフォーム定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//Mix::Matrix4x4[20] : ワールド行列

		//PS
		//無し

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// マテリアル定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_MATERIAL
		{
			Mix::Vector4 ambientColor;		//アンビエント( XYZ=RGB )
			Mix::Vector4 diffuseColor;		//ディフューズ( XYZW=RGBA )
			Mix::Vector4 diffuseParam;		//ディフューズ( X=FresnelRatio Y=RLHardness Z=RLScale )
			Mix::Vector4 specularColor;		//スペキュラー( XYZ=RGB W=Intensity )
			Mix::Vector4 specularParam;		//スペキュラー( X=Hardness Y=Scale Z=CTFresnel W=CTRoughness2 )
			Mix::Vector4 reflectParam0;		//リフレクト( X=Scale )
			Mix::Vector4 reflectParam1;		//リフレクト( X=Tint Y=Intensity Z=Bias W=Exprosure )
			Mix::Vector4 emissiveColor;		//エミッシブ( XYZ=RGB W=Scale )
			Mix::Vector4 bumpParam0;		//バンプ( X=HeightScale Y=HeightSample Z=ReflectRatio W=WaveOffset )
			Mix::Vector4 bumpParam1;		//バンプ( XY=WavwUV Z=RefractRatio )
			Mix::Vector4 particleParam;		//パーティクル( X=SodtCoiffe )
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ローカルライト定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LOCAL_LIGHT
		{
			Mix::Vector4 pos[Renderer::LOCAL_LIGHT_MAX];	//位置( XYZ=Pos W=Enabled )
			Mix::Vector4 dir[Renderer::LOCAL_LIGHT_MAX];	//方向( XYZ=Dir W=SpotLightEnabled )
			Mix::Vector4 atten[Renderer::LOCAL_LIGHT_MAX];	//減衰( X=Linear Y=Quadratic Z=Exponent )
			Mix::Vector4 color[Renderer::LOCAL_LIGHT_MAX];	//色( XYZ=RGB W=Intensity )
			Mix::Vector4 misc[Renderer::LOCAL_LIGHT_MAX];	//その他 
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// スカイドーム
		////////////////////////////////////////////////////////////////////////////////////////////////////

		/*
			デフォルト
		*/

		//VS
		struct VSC_SKYDOME_DEFAULT
		{
			Mix::Matrix4x4 wvpMat;
		};

		//PS
		struct PSC_SKYDOME_DEFAULT
		{
			Mix::Vector4 baseColor;		//ベースカラー
			Mix::Vector4 baseParam;		//ベース( X=Scale Y=Alpha )
			Mix::Vector4 cloudColor;	//クラウド : 色( XYZ=RGB W=強度 )
			Mix::Vector4 cloudLayer[2];	//クラウド : レイヤー( XY=UVオフセット Z=UVスケール W=不透明度 )
		};

		/*
			大気散乱シミュレーション
		*/

		//VS
		struct VSC_SKYDOME_ATMOSPHERE
		{
			Mix::Matrix4x4 wMat;
			Mix::Matrix4x4 wvpMat;
		};

		//PS
		struct PSC_SKYDOME_ATMOSPHERE
		{
			Mix::Vector4 sunColor;		//太陽( XYZ=RGB )
			Mix::Vector4 nightColor;	//夜空の色( XYZ=RGB W=移行率 )
			Mix::Vector4 baseParam;		//ベース( X=Scale Y=Alpha )
			Mix::Vector4 cloudColor;	//クラウド : 色( XYZ=RGB W=強度 )
			Mix::Vector4 cloudLayer[2];	//クラウド : レイヤー( XY=UVオフセット Z=UVスケール W=不透明度 )
			Mix::Vector4 cloudParams;	//クラウド : パラメータ( X=墨の閾値 Y=墨の倍率 Z=影の暗さ )
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// スカイドーム : パノラマ
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		struct VSC_SKYDOME_PANORAMA
		{
			Mix::Matrix4x4 wvpMat;
			Mix::Matrix4x4 wMat;
		};

		//PS
		struct PSC_SKYDOME_PANORAMA
		{
			Mix::Vector4 baseColor;		//ベースカラー( XYZW=RGBA )
			Mix::Vector4 param;			//パラメータ( X=テクスチャのリピート Y=距離 Z=フォグ率 )
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// サンプリング定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		//Mix::Vector4( XY=TexelSize Z=Scale )

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ブラー定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		//Mix::Vector4[3] XY=Offset W=Weight

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ガウシンアブラー定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//Mix::Vector4[8] オフセット

		//PS
		struct PSC_GAUSSIAN_BLUR
		{
			Mix::Vector4 offset;	//オフセット( XY=Offset )
			Float32 weights[8];
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ガウシンアブラーEX定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_GAUSSIAN_BLUR_EX
		{
			Float32 halfRadius;
			Float32 reserve0[3];

			Mix::Vector3 inc;
			Float32 reserve1[1];

			Mix::Vector2 step;
			Float32 reserve2[2];
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// シャドウマッピング定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_SM
		{
			//params
			Float32 falloutStart;
			Float32 invFalloutDist;
			Float32 refractFactor;
			Float32 reserve;

			Mix::Vector4 color;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// SOAA定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_SSAO
		{
			Float32 radius;
			Float32 threshold;
			Float32 depth;
			Float32 intensity;

			Mix::Vector2 ntexAspect;
			Float32 reserve[2];

			Mix::Vector4 color;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 輝度 : トランスフォーム定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LUM_TRANSFORM
		{
			Mix::Vector2 texelSize;
			Mix::Vector2 lumRange;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 輝度 : アダプテッド定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LUM_ADAPTED
		{
			Float32 rods;
			Float32 cones;
			Float32 deltaTime;
			Float32 reserve0;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 輝度 : オペレーター定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LUM_OPERATOR
		{
			Float32 middleGray;
			Float32 white2Inv;
			Float32 reserve[2];
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ブライトパス定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_BRIGHT_PASS
		{
			Float32 middleGray;
			Float32 white2Inv;
			Float32 threshold;
			Float32 offset;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// アンダーウォーター定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_UNDER_WATER
		{
			Mix::Vector4 color;	//カラー( XYZ=RGB W=Intensity )
			Float32 density;
			Float32 intensity;
			Float32 threshold;
			Float32 offset;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ライトシャフト : 初期化定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LIGHT_SHAFTS_INIT
		{
			Float32 whiteness;
			Mix::Vector2 ntexAspect;
			Float32 reserve;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ライトシャフト : ブラー定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LIGHT_SHAFTS_BLUR
		{
			Mix::Vector2 lightPos;
			Float32 EdotL;
			Float32 reserve0;

			Float32 density;
			Float32 decay;
			Float32 exposure;
			Float32 reserve1;

			Float32 fiStart;
			Float32 fiEnd;
			Float32 fiInvDist;
			Float32 reserve2;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// レンズフレア : イメージ定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LF_IMAGE
		{
			Mix::Vector3 distoVec;
			Float32 numGhost;
			Float32 ghostWeight;
			Float32 ghostDisp;
			Float32 haloWeight;
			Float32 haloWidth;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// レンズフレア : モディファイ定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LF_MODIFY
		{
			Float32 dirtInt;
			Float32 dirtExp;
			Float32 brustInt;
			Float32 brustExp;

			Mix::Matrix4x4 camMat;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// フィルミック : HABLE
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_FILMIC_HABLE
		{
			Float32 exposureBias;
			Float32 shoulderStrength;
			Float32 linearStrength;
			Float32 linearAngle;
			Float32 toeStrength;
			Float32 toeNumerator;
			Float32 toeDenominator;
			Float32 linearWhitePointValue;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ガンマ補正定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		//Mix::Vector4( XYZ=ガンマ値の逆数 )

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// カメラモーションブラー定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_CAM_MOT_BLUR
		{
			Mix::Matrix4x4 invViewProjMat;
			Mix::Matrix4x4 preViewProjMat;

			Float32 cp0;
			Float32 cp1;
			Float32 cp2;
			Float32 reserve;

			Float32 scale;
			Float32 intensity;
			Float32 invVolume;
			Float32 dist;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 色収差 : イメージ定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_CA_IMAGE
		{
			Float32 k;
			Float32 kCube;
			Float32 scale;
			Float32 reserve;

			Mix::Vector4 colorFactor;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 色収差 : フィニッシュ定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_CA_FINISH
		{
			Float32 weight;
			Float32 fiStartZ;
			Float32 fiInvDist;
			Float32 reserve;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 被写界深度定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_DOF
		{
			Float32 nearZ;
			Float32 farZ;
			Float32 invNearDist;
			Float32 invFarDist;

			Float32 blurThreshold;
			Float32 invBlurThreaholdN;
			Float32 invBlurThreaholdF;
			Float32 reserve;

			Mix::Vector4 samplingTable[Renderer::DOF_SAMPLING_NUM];
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 歪曲収差定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_LENS_DIST
		{
			Float32 k;
			Float32 kCube;
			Float32 scale;
			Float32 reserve;

			Mix::Vector4 colorFactor;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// ヴィネット定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_VIGNETTE
		{
			Float32 start;
			Float32 invDist;
			Float32 reserve[2];

			Mix::Vector4 color;
		};

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// FXAA定数
		////////////////////////////////////////////////////////////////////////////////////////////////////

		//VS
		//無し

		//PS
		struct PSC_FXAA
		{
			Mix::Vector4 texCoords[2];
			Mix::Vector4 invScreenSize;
		};

	private:
		Mix::Graphics::IShaderConstant* m_pGeneralVSC;
		Mix::Graphics::IShaderConstant* m_pGeneralPSC;

		Mix::Graphics::IShaderConstant* m_pSkyDomeVSC;
		Mix::Graphics::IShaderConstant* m_pSkyDomePSC;
		Mix::Graphics::IShaderConstant* m_pPanoramaVSC;
		Mix::Graphics::IShaderConstant* m_pPanoramaPSC;

		Mix::Graphics::IShaderConstant* m_pTransformVSC;
		Mix::Graphics::IShaderConstant* m_pLocalLightPSC;

		Mix::Graphics::IShaderConstant* m_pSamplingPSC;
		Mix::Graphics::IShaderConstant* m_pBlurPSC;
		Mix::Graphics::IShaderConstant* m_pGaussianBlurVSC;
		Mix::Graphics::IShaderConstant* m_pGaussianBlurPSC;
		Mix::Graphics::IShaderConstant* m_pGaussianBlurExPSC;
		Mix::Graphics::IShaderConstant* m_pShadowMappingPSC;
		Mix::Graphics::IShaderConstant* m_pSsaoPSC;
		Mix::Graphics::IShaderConstant* m_pLumTransformPSC;
		Mix::Graphics::IShaderConstant* m_pLumAdaptedPSC;
		Mix::Graphics::IShaderConstant* m_pLumOperatorPSC;
		Mix::Graphics::IShaderConstant* m_pBrightPassPSC;
		Mix::Graphics::IShaderConstant* m_pUnderWaterPSC;
		Mix::Graphics::IShaderConstant* m_pLSInitPSC;
		Mix::Graphics::IShaderConstant* m_pLSBlurPSC;
		Mix::Graphics::IShaderConstant* m_pLFImagePSC;
		Mix::Graphics::IShaderConstant* m_pLFModifyPSC;
		Mix::Graphics::IShaderConstant* m_pFIHablePSC;
		Mix::Graphics::IShaderConstant* m_pCAImagePSC;
		Mix::Graphics::IShaderConstant* m_pCAFinishPSC;
		Mix::Graphics::IShaderConstant* m_pGammaCorrectPSC;
		Mix::Graphics::IShaderConstant* m_pCamMotBlurPSC;
		Mix::Graphics::IShaderConstant* m_pDofPSC;
		Mix::Graphics::IShaderConstant* m_pLensDistPSC;
		Mix::Graphics::IShaderConstant* m_pVignettePSC;
		Mix::Graphics::IShaderConstant* m_pFxaaPSC;

	public:
		static Renderer* CreateInstance( Mix::Scene::Standard::Common::EffectPackage* pEffectPackage, const wchar_t* pDebugName );

	private:
		Renderer( Mix::Scene::Standard::Common::EffectPackage* pEffectPackage, const wchar_t* pDebugName );
		virtual ~Renderer( void );

	protected:
		////////////////////////////////////////////////////////////////////////////////////////////////////
		// Mix::Scene::Common::Renderer
		////////////////////////////////////////////////////////////////////////////////////////////////////

		virtual Boolean OnInitialize( const Mix::Scene::RENDERER_CONFIG& config );
		virtual Boolean OnUpdateConfig( const Mix::Scene::RENDERER_CONFIG& config );

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// Mix::Scene::Standard::Common::Renderer
		////////////////////////////////////////////////////////////////////////////////////////////////////

		virtual void OnPrepareRendering( const Renderer::PREPARE_REDNERING_EVENT_ARGS& e );
		virtual void OnTransform( const Renderer::TRANSFORM_EVENT_ARGS& e );
		virtual void OnPlacementLocalLight( const Renderer::LOCALLIGHT_EVENT_ARGS& e );
		virtual void OnRenderSkyDome( const Renderer::SKYDOME_DEFAULT_EVENT_ARGS& e );
		virtual void OnRenderSkyDome( const Renderer::SKYDOME_ATMOSPHERE_EVENT_ARGS& e );
		virtual void OnRenderPanorama( const Renderer::SKYDOME_PANORAMA_EVENT_ARGS& e );

		virtual void OnRenderSampling( const Renderer::RENDER_SAMPLING_ARGS& e );
		virtual void OnRenderBlur( const Renderer::RENDER_BLUR_ARGS& e );
		virtual void OnRenderGaussianBlur( const Renderer::RENDER_GAUSSIAN_BLUR_ARGS& e );
		virtual void OnRenderGaussianBlurEx( const Renderer::RENDER_GAUSSIAN_BLUR_EX_ARGS& e );
		virtual void OnRenderAmbientOcclusion( const Renderer::RENDER_AMBIENT_OCCLUSION_ARGS& e );
		virtual void OnRenderShadowMapping( const Renderer::RENDER_SHADOW_MAPPING_ARGS& e );
		virtual void OnRenderLumTransform( const Renderer::RENDER_LUM_TRANSFORM_ARGS& e );
		virtual void OnRenderLumAdapted( const Renderer::RENDER_LUM_ADAPTED_ARGS& e );
		virtual void OnRenderLumOperator( const Renderer::RENDER_LUM_OPERATOR_ARGS& e );
		virtual void OnRenderBrightPass( const Renderer::RENDER_BRIGHTPASS_ARGS& e );
		virtual void OnRenderUnderWater( const Renderer::UNDERWATER_EVENT_ARGS& e );
		virtual void OnRenderLightShaftsInit( const Renderer::RENDER_LIGHT_SHAFTS_INIT_ARGS& e );
		virtual void OnRenderLightShaftsBlur( const Renderer::RENDER_LIGHT_SHAFTS_BLUR_ARGS& e );
		virtual void OnRenderLensFlareImage( const Renderer::RENDER_LENSFLARE_IMAGE_ARGS& e );
		virtual void OnRenderLensFlareModify( const Renderer::RENDER_LENSFLARE_MODIFY_ARGS& e );
		virtual void OnRenderFilmicHable( const Renderer::RENDER_FILMIC_HABLE_ARGS& e );
		virtual void OnRenderChromatismImage( const Renderer::RENDER_CHROMATISM_IMAGE_ARGS& e );
		virtual void OnRenderChromatismFinish( const Renderer::RENDER_CHROMATISM_FINISH_ARGS& e );
		virtual void OnRenderGammaCorrect( const Renderer::RENDER_GAMMA_ARGS& e );
		virtual void OnRenderCameraMotionBlur( const Renderer::RENDER_CAMERA_MOTION_BLUR_ARGS& e );
		virtual void OnRenderDof( const Renderer::RENDER_DOF_ARGS& e );
		virtual void OnRenderLensDistortion( const Renderer::RENDER_LENS_DISTORTION_ARGS& e );
		virtual void OnRenderVignette( const Renderer::RENDER_VIGNETTE_ARGS& e );
		virtual void OnRenderFXAA( const Renderer::RENDER_FXAA_ARGS& e );
	};

}}}}
