diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/env_tonemap_controller.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/env_tonemap_controller.cpp')
| -rw-r--r-- | mp/src/game/server/env_tonemap_controller.cpp | 249 |
1 files changed, 249 insertions, 0 deletions
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: <target tonemap scale> <blend time>\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: <target tonemap scale> <blend time>\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: <max bloom> <min bloom>\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;
+}
|