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/client/c_sun.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/client/c_sun.cpp')
| -rw-r--r-- | mp/src/game/client/c_sun.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/mp/src/game/client/c_sun.cpp b/mp/src/game/client/c_sun.cpp new file mode 100644 index 00000000..c11cd52c --- /dev/null +++ b/mp/src/game/client/c_sun.cpp @@ -0,0 +1,141 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "c_sun.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+static void RecvProxy_HDRColorScale( const CRecvProxyData *pData, void *pStruct, void *pOut )
+{
+ C_Sun *pSun = ( C_Sun * )pStruct;
+
+ pSun->m_Overlay.m_flHDRColorScale = pData->m_Value.m_Float;
+ pSun->m_GlowOverlay.m_flHDRColorScale = pData->m_Value.m_Float;
+}
+
+IMPLEMENT_CLIENTCLASS_DT_NOBASE( C_Sun, DT_Sun, CSun )
+
+ RecvPropInt( RECVINFO(m_clrRender), 0, RecvProxy_IntToColor32 ),
+ RecvPropInt( RECVINFO(m_clrOverlay), 0, RecvProxy_IntToColor32 ),
+ RecvPropVector( RECVINFO( m_vDirection ) ),
+ RecvPropInt( RECVINFO( m_bOn ) ),
+ RecvPropInt( RECVINFO( m_nSize ) ),
+ RecvPropInt( RECVINFO( m_nOverlaySize ) ),
+ RecvPropInt( RECVINFO( m_nMaterial ) ),
+ RecvPropInt( RECVINFO( m_nOverlayMaterial ) ),
+ RecvPropFloat("HDRColorScale", 0, SIZEOF_IGNORE, 0, RecvProxy_HDRColorScale),
+
+END_RECV_TABLE()
+
+C_Sun::C_Sun()
+{
+ m_Overlay.m_bDirectional = true;
+ m_Overlay.m_bInSky = true;
+
+ m_GlowOverlay.m_bDirectional = true;
+ m_GlowOverlay.m_bInSky = true;
+}
+
+
+C_Sun::~C_Sun()
+{
+}
+
+
+void C_Sun::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ // We have to do special setup on our colors because we're tinting an additive material.
+ // If we don't have at least one component at full strength, the luminosity of the material
+ // will change and that will cause the material to become more translucent This would be incorrect
+ // for the sun, which should always be completely opaque at its core. Here, we renormalize the
+ // components to make sure only hue is altered.
+
+ float maxComponent = MAX ( m_clrRender->r, MAX ( m_clrRender->g, m_clrRender->b ) );
+
+ Vector vOverlayColor;
+ Vector vMainColor;
+
+ // Re-normalize the color ranges
+ if ( maxComponent <= 0.0f )
+ {
+ // This is an error, set to pure white
+ vMainColor.Init( 1.0f, 1.0f, 1.0f );
+ }
+ else
+ {
+ vMainColor.x = m_clrRender->r / maxComponent;
+ vMainColor.y = m_clrRender->g / maxComponent;
+ vMainColor.z = m_clrRender->b / maxComponent;
+ }
+
+ // If we're non-zero, use the value (otherwise use the value we calculated above)
+ if ( m_clrOverlay.r != 0 || m_clrOverlay.g != 0 || m_clrOverlay.b != 0 )
+ {
+ // Get our overlay color
+ vOverlayColor.x = m_clrOverlay.r / 255.0f;
+ vOverlayColor.y = m_clrOverlay.g / 255.0f;
+ vOverlayColor.z = m_clrOverlay.b / 255.0f;
+ }
+ else
+ {
+ vOverlayColor = vMainColor;
+ }
+
+ //
+ // Setup the core overlay
+ //
+
+ m_Overlay.m_vDirection = m_vDirection;
+ m_Overlay.m_nSprites = 1;
+
+ m_Overlay.m_Sprites[0].m_vColor = vMainColor;
+ m_Overlay.m_Sprites[0].m_flHorzSize = m_nSize;
+ m_Overlay.m_Sprites[0].m_flVertSize = m_nSize;
+
+ const model_t* pModel = (m_nMaterial != 0) ? modelinfo->GetModel( m_nMaterial ) : NULL;
+ const char *pModelName = pModel ? modelinfo->GetModelName( pModel ) : "";
+ m_Overlay.m_Sprites[0].m_pMaterial = materials->FindMaterial( pModelName, TEXTURE_GROUP_OTHER );
+ m_Overlay.m_flProxyRadius = 0.05f; // about 1/20th of the screen
+
+ //
+ // Setup the external glow overlay
+ //
+
+ m_GlowOverlay.m_vDirection = m_vDirection;
+ m_GlowOverlay.m_nSprites = 1;
+
+ m_GlowOverlay.m_Sprites[0].m_vColor = vOverlayColor;
+ m_GlowOverlay.m_Sprites[0].m_flHorzSize = m_nOverlaySize;
+ m_GlowOverlay.m_Sprites[0].m_flVertSize = m_nOverlaySize;
+
+ pModel = (m_nOverlayMaterial != 0) ? modelinfo->GetModel( m_nOverlayMaterial ) : NULL;
+ pModelName = pModel ? modelinfo->GetModelName( pModel ) : "";
+ m_GlowOverlay.m_Sprites[0].m_pMaterial = materials->FindMaterial( pModelName, TEXTURE_GROUP_OTHER );
+
+ // This texture will fade away as the dot between camera and sun changes
+ m_GlowOverlay.SetModulateByDot();
+ m_GlowOverlay.m_flProxyRadius = 0.05f; // about 1/20th of the screen
+
+
+ // Either activate or deactivate.
+ if ( m_bOn )
+ {
+ m_Overlay.Activate();
+ m_GlowOverlay.Activate();
+ }
+ else
+ {
+ m_Overlay.Deactivate();
+ m_GlowOverlay.Deactivate();
+ }
+}
+
+
+
|