From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/server/env_tonemap_controller.cpp | 249 ++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 mp/src/game/server/env_tonemap_controller.cpp (limited to 'mp/src/game/server/env_tonemap_controller.cpp') diff --git a/mp/src/game/server/env_tonemap_controller.cpp b/mp/src/game/server/env_tonemap_controller.cpp new file mode 100644 index 00000000..b4d3e43a --- /dev/null +++ b/mp/src/game/server/env_tonemap_controller.cpp @@ -0,0 +1,249 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include "cbase.h" +#include "baseentity.h" +#include "entityoutput.h" +#include "convar.h" +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +ConVar mat_hdr_tonemapscale( "mat_hdr_tonemapscale", "1.0", FCVAR_CHEAT, "The HDR tonemap scale. 1 = Use autoexposure, 0 = eyes fully closed, 16 = eyes wide open." ); + +// 0 - eyes fully closed / fully black +// 1 - nominal +// 16 - eyes wide open / fully white + +//----------------------------------------------------------------------------- +// Purpose: Entity that controls player's tonemap +//----------------------------------------------------------------------------- +class CEnvTonemapController : public CPointEntity +{ + DECLARE_CLASS( CEnvTonemapController, CPointEntity ); +public: + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + void Spawn( void ); + int UpdateTransmitState( void ); + void UpdateTonemapScaleBlend( void ); + + // Inputs + void InputSetTonemapScale( inputdata_t &inputdata ); + void InputBlendTonemapScale( inputdata_t &inputdata ); + void InputSetTonemapRate( inputdata_t &inputdata ); + void InputSetAutoExposureMin( inputdata_t &inputdata ); + void InputSetAutoExposureMax( inputdata_t &inputdata ); + void InputUseDefaultAutoExposure( inputdata_t &inputdata ); + void InputSetBloomScale( inputdata_t &inputdata ); + void InputUseDefaultBloomScale( inputdata_t &inputdata ); + void InputSetBloomScaleRange( inputdata_t &inputdata ); + +private: + float m_flBlendTonemapStart; // HDR Tonemap at the start of the blend + float m_flBlendTonemapEnd; // Target HDR Tonemap at the end of the blend + float m_flBlendEndTime; // Time at which the blend ends + float m_flBlendStartTime; // Time at which the blend started + + CNetworkVar( bool, m_bUseCustomAutoExposureMin ); + CNetworkVar( bool, m_bUseCustomAutoExposureMax ); + CNetworkVar( bool, m_bUseCustomBloomScale ); + CNetworkVar( float, m_flCustomAutoExposureMin ); + CNetworkVar( float, m_flCustomAutoExposureMax ); + CNetworkVar( float, m_flCustomBloomScale); + CNetworkVar( float, m_flCustomBloomScaleMinimum); +}; + +LINK_ENTITY_TO_CLASS( env_tonemap_controller, CEnvTonemapController ); + +BEGIN_DATADESC( CEnvTonemapController ) + DEFINE_FIELD( m_flBlendTonemapStart, FIELD_FLOAT ), + DEFINE_FIELD( m_flBlendTonemapEnd, FIELD_FLOAT ), + DEFINE_FIELD( m_flBlendEndTime, FIELD_TIME ), + DEFINE_FIELD( m_flBlendStartTime, FIELD_TIME ), + DEFINE_FIELD( m_bUseCustomAutoExposureMin, FIELD_BOOLEAN ), + DEFINE_FIELD( m_bUseCustomAutoExposureMax, FIELD_BOOLEAN ), + DEFINE_FIELD( m_flCustomAutoExposureMin, FIELD_FLOAT ), + DEFINE_FIELD( m_flCustomAutoExposureMax, FIELD_FLOAT ), + DEFINE_FIELD( m_flCustomBloomScale, FIELD_FLOAT ), + DEFINE_FIELD( m_flCustomBloomScaleMinimum, FIELD_FLOAT ), + DEFINE_FIELD( m_bUseCustomBloomScale, FIELD_BOOLEAN ), + + DEFINE_THINKFUNC( UpdateTonemapScaleBlend ), + + // Inputs + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetTonemapScale", InputSetTonemapScale ), + DEFINE_INPUTFUNC( FIELD_STRING, "BlendTonemapScale", InputBlendTonemapScale ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetTonemapRate", InputSetTonemapRate ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetAutoExposureMin", InputSetAutoExposureMin ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetAutoExposureMax", InputSetAutoExposureMax ), + DEFINE_INPUTFUNC( FIELD_VOID, "UseDefaultAutoExposure", InputUseDefaultAutoExposure ), + DEFINE_INPUTFUNC( FIELD_VOID, "UseDefaultBloomScale", InputUseDefaultBloomScale ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetBloomScale", InputSetBloomScale ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "SetBloomScaleRange", InputSetBloomScaleRange ), +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST( CEnvTonemapController, DT_EnvTonemapController ) + SendPropInt( SENDINFO(m_bUseCustomAutoExposureMin), 1, SPROP_UNSIGNED ), + SendPropInt( SENDINFO(m_bUseCustomAutoExposureMax), 1, SPROP_UNSIGNED ), + SendPropInt( SENDINFO(m_bUseCustomBloomScale), 1, SPROP_UNSIGNED ), + SendPropFloat( SENDINFO(m_flCustomAutoExposureMin), 0, SPROP_NOSCALE), + SendPropFloat( SENDINFO(m_flCustomAutoExposureMax), 0, SPROP_NOSCALE), + SendPropFloat( SENDINFO(m_flCustomBloomScale), 0, SPROP_NOSCALE), + SendPropFloat( SENDINFO(m_flCustomBloomScaleMinimum), 0, SPROP_NOSCALE), +END_SEND_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvTonemapController::Spawn( void ) +{ + SetSolid( SOLID_NONE ); + SetMoveType( MOVETYPE_NONE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +int CEnvTonemapController::UpdateTransmitState() +{ + return SetTransmitState( FL_EDICT_ALWAYS ); +} + +//----------------------------------------------------------------------------- +// Purpose: Set the tonemap scale to the specified value +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetTonemapScale( inputdata_t &inputdata ) +{ + float flRemapped = inputdata.value.Float(); + mat_hdr_tonemapscale.SetValue( flRemapped ); +} + +//----------------------------------------------------------------------------- +// Purpose: Blend the tonemap scale to the specified value +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputBlendTonemapScale( inputdata_t &inputdata ) +{ + char parseString[255]; + Q_strncpy(parseString, inputdata.value.String(), sizeof(parseString)); + + // Get the target tonemap scale + char *pszParam = strtok(parseString," "); + if ( !pszParam || !pszParam[0] ) + { + Warning("%s (%s) received BlendTonemapScale input without a target tonemap scale. Syntax: \n", GetClassname(), GetDebugName() ); + return; + } + m_flBlendTonemapEnd = atof( pszParam ); + + // Get the blend time + pszParam = strtok(NULL," "); + if ( !pszParam || !pszParam[0] ) + { + Warning("%s (%s) received BlendTonemapScale input without a blend time. Syntax: \n", GetClassname(), GetDebugName() ); + return; + } + m_flBlendEndTime = gpGlobals->curtime + atof( pszParam ); + + m_flBlendStartTime = gpGlobals->curtime; + m_flBlendTonemapStart = mat_hdr_tonemapscale.GetFloat(); + + // Start thinking + SetNextThink( gpGlobals->curtime + 0.1 ); + SetThink( &CEnvTonemapController::UpdateTonemapScaleBlend ); +} + +//----------------------------------------------------------------------------- +// Purpose: set a base and minimum bloom scale +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetBloomScaleRange( inputdata_t &inputdata ) +{ + float bloom_max=1, bloom_min=1; + int nargs=sscanf("%f %f",inputdata.value.String(), bloom_max, bloom_min ); + if (nargs != 2) + { + Warning("%s (%s) received SetBloomScaleRange input without 2 arguments. Syntax: \n", GetClassname(), GetDebugName() ); + return; + } + m_flCustomBloomScale=bloom_max; + m_flCustomBloomScale=bloom_min; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetTonemapRate( inputdata_t &inputdata ) +{ + // TODO: There should be a better way to do this. + ConVarRef mat_hdr_manual_tonemap_rate( "mat_hdr_manual_tonemap_rate" ); + if ( mat_hdr_manual_tonemap_rate.IsValid() ) + { + float flTonemapRate = inputdata.value.Float(); + mat_hdr_manual_tonemap_rate.SetValue( flTonemapRate ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Blend the tonemap scale to the specified value +//----------------------------------------------------------------------------- +void CEnvTonemapController::UpdateTonemapScaleBlend( void ) +{ + float flRemapped = RemapValClamped( gpGlobals->curtime, m_flBlendStartTime, m_flBlendEndTime, m_flBlendTonemapStart, m_flBlendTonemapEnd ); + mat_hdr_tonemapscale.SetValue( flRemapped ); + + //Msg("Setting tonemap scale to %f (curtime %f, %f -> %f)\n", flRemapped, gpGlobals->curtime, m_flBlendStartTime, m_flBlendEndTime ); + + // Stop when we're out of the blend range + if ( gpGlobals->curtime >= m_flBlendEndTime ) + return; + + SetNextThink( gpGlobals->curtime + 0.1 ); +} + +//----------------------------------------------------------------------------- +// Purpose: Set the auto exposure min to the specified value +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetAutoExposureMin( inputdata_t &inputdata ) +{ + m_flCustomAutoExposureMin = inputdata.value.Float(); + m_bUseCustomAutoExposureMin = true; +} + +//----------------------------------------------------------------------------- +// Purpose: Set the auto exposure max to the specified value +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetAutoExposureMax( inputdata_t &inputdata ) +{ + m_flCustomAutoExposureMax = inputdata.value.Float(); + m_bUseCustomAutoExposureMax = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputUseDefaultAutoExposure( inputdata_t &inputdata ) +{ + m_bUseCustomAutoExposureMin = false; + m_bUseCustomAutoExposureMax = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputSetBloomScale( inputdata_t &inputdata ) +{ + m_flCustomBloomScale = inputdata.value.Float(); + m_flCustomBloomScaleMinimum = m_flCustomBloomScale; + m_bUseCustomBloomScale = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvTonemapController::InputUseDefaultBloomScale( inputdata_t &inputdata ) +{ + m_bUseCustomBloomScale = false; +} -- cgit v1.2.3