You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.0 KiB
141 lines
4.0 KiB
//========= 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(); |
|
} |
|
} |
|
|
|
|
|
|
|
|