text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: Color correction entity with simple radial falloff
  //
  // $NoKeywords: $
  //===========================================================================//
  #include "cbase.h"
  
  #include "filesystem.h"
  #include "cdll_client_int.h"
  #include "colorcorrectionmgr.h"
  #include "materialsystem/MaterialSystemUtil.h"
  
  // memdbgon must be the last include file in a .cpp file!!!
  #include "tier0/memdbgon.h"
  
  
  static ConVar mat_colcorrection_disableentities( "mat_colcorrection_disableentities", "0", FCVAR_NONE, "Disable map color-correction entities" );
  
  
  //------------------------------------------------------------------------------
  // Purpose : Color correction entity with radial falloff
  //------------------------------------------------------------------------------
  class C_ColorCorrection : public C_BaseEntity
  {
  public:
  	DECLARE_CLASS( C_ColorCorrection, C_BaseEntity );
  
  	DECLARE_CLIENTCLASS();
  
  	C_ColorCorrection();
  	virtual ~C_ColorCorrection();
  
  	void OnDataChanged(DataUpdateType_t updateType);
  	bool ShouldDraw();
  
  	void ClientThink();
  
  private:
  	Vector	m_vecOrigin;
  
  	float	m_minFalloff;
  	float	m_maxFalloff;
  	float	m_flCurWeight;
  	char	m_netLookupFilename[MAX_PATH];
  
  	bool	m_bEnabled;
  
  	ClientCCHandle_t m_CCHandle;
  };
  
  IMPLEMENT_CLIENTCLASS_DT(C_ColorCorrection, DT_ColorCorrection, CColorCorrection)
  	RecvPropVector( RECVINFO(m_vecOrigin) ),
  	RecvPropFloat(  RECVINFO(m_minFalloff) ),
  	RecvPropFloat(  RECVINFO(m_maxFalloff) ),
  	RecvPropFloat(  RECVINFO(m_flCurWeight) ),
  	RecvPropString( RECVINFO(m_netLookupFilename) ),
  	RecvPropBool(   RECVINFO(m_bEnabled) ),
  
  END_RECV_TABLE()
  
  
  //------------------------------------------------------------------------------
  // Constructor, destructor
  //------------------------------------------------------------------------------
  C_ColorCorrection::C_ColorCorrection()
  {
  	m_CCHandle = INVALID_CLIENT_CCHANDLE;
  }
  
  C_ColorCorrection::~C_ColorCorrection()
  {
  	g_pColorCorrectionMgr->RemoveColorCorrection( m_CCHandle );
  }
  
  
  //------------------------------------------------------------------------------
  // Purpose :
  // Input   :
  // Output  :
  //------------------------------------------------------------------------------
  void C_ColorCorrection::OnDataChanged(DataUpdateType_t updateType)
  {
  	BaseClass::OnDataChanged( updateType );
  
  	if ( updateType == DATA_UPDATE_CREATED )
  	{
  		if ( m_CCHandle == INVALID_CLIENT_CCHANDLE )
  		{
  			char filename[MAX_PATH];
  			Q_strncpy( filename, m_netLookupFilename, MAX_PATH );
  
  			m_CCHandle = g_pColorCorrectionMgr->AddColorCorrection( filename );
  			SetNextClientThink( ( m_CCHandle != INVALID_CLIENT_CCHANDLE ) ? CLIENT_THINK_ALWAYS : CLIENT_THINK_NEVER );
  		}
  	}
  }
  
  //------------------------------------------------------------------------------
  // We don't draw...
  //------------------------------------------------------------------------------
  bool C_ColorCorrection::ShouldDraw()
  {
  	return false;
  }
  
  void C_ColorCorrection::ClientThink()
  {
  	if ( m_CCHandle == INVALID_CLIENT_CCHANDLE )
  		return;
  
  	if ( mat_colcorrection_disableentities.GetInt() )
  	{
  		// Allow the colorcorrectionui panel (or user) to turn off color-correction entities
  		g_pColorCorrectionMgr->SetColorCorrectionWeight( m_CCHandle, 0.0f );
  		return;
  	}
  
  	if( !m_bEnabled && m_flCurWeight == 0.0f )
  	{
  		g_pColorCorrectionMgr->SetColorCorrectionWeight( m_CCHandle, 0.0f );
  		return;
  	}
  
  	//SecobMod_FixMe Get Nearest player?(maybe not cuz its client side local?)
  	C_BaseEntity *pPlayer = C_BasePlayer::GetLocalPlayer();
  	if( !pPlayer )
  		return;
  
  	Vector playerOrigin = pPlayer->GetAbsOrigin();
  
  	float weight = 0;
  	if ( ( m_minFalloff != -1 ) && ( m_maxFalloff != -1 ) && m_minFalloff != m_maxFalloff )
  	{
  		float dist = (playerOrigin - m_vecOrigin).Length();
  		weight = (dist-m_minFalloff) / (m_maxFalloff-m_minFalloff);
  		if ( weight<0.0f ) weight = 0.0f;	
  		if ( weight>1.0f ) weight = 1.0f;	
  	}
  	
  	g_pColorCorrectionMgr->SetColorCorrectionWeight( m_CCHandle, m_flCurWeight * ( 1.0 - weight ) );
  
  	BaseClass::ClientThink();
  }
  
  
  
  
  
  
  
  
  
  
  
  
  
  