//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "func_areaportalwindow.h" #include "entitylist.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" // The server will still send entities through a window even after it opaque // to allow for net lag. #define FADE_DIST_BUFFER 10 LINK_ENTITY_TO_CLASS( func_areaportalwindow, CFuncAreaPortalWindow ); IMPLEMENT_SERVERCLASS_ST( CFuncAreaPortalWindow, DT_FuncAreaPortalWindow ) SendPropFloat( SENDINFO(m_flFadeDist), 0, SPROP_NOSCALE ), SendPropFloat( SENDINFO(m_flFadeStartDist), 0, SPROP_NOSCALE ), SendPropFloat( SENDINFO(m_flTranslucencyLimit), 0, SPROP_NOSCALE ), SendPropModelIndex(SENDINFO(m_iBackgroundModelIndex) ), END_SEND_TABLE() BEGIN_DATADESC( CFuncAreaPortalWindow ) DEFINE_KEYFIELD( m_portalNumber, FIELD_INTEGER, "portalnumber" ), DEFINE_KEYFIELD( m_flFadeStartDist, FIELD_FLOAT, "FadeStartDist" ), DEFINE_KEYFIELD( m_flFadeDist, FIELD_FLOAT, "FadeDist" ), DEFINE_KEYFIELD( m_flTranslucencyLimit, FIELD_FLOAT, "TranslucencyLimit" ), DEFINE_KEYFIELD( m_iBackgroundBModelName,FIELD_STRING, "BackgroundBModel" ), // DEFINE_KEYFIELD( m_iBackgroundModelIndex,FIELD_INTEGER ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetFadeStartDistance", InputSetFadeStartDistance ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetFadeEndDistance", InputSetFadeEndDistance ), END_DATADESC() CFuncAreaPortalWindow::CFuncAreaPortalWindow() { m_iBackgroundModelIndex = -1; } CFuncAreaPortalWindow::~CFuncAreaPortalWindow() { } void CFuncAreaPortalWindow::Spawn() { Precache(); engine->SetAreaPortalState( m_portalNumber, 1 ); } void CFuncAreaPortalWindow::Activate() { BaseClass::Activate(); // Find our background model. CBaseEntity *pBackground = gEntList.FindEntityByName( NULL, m_iBackgroundBModelName ); if( pBackground ) { m_iBackgroundModelIndex = modelinfo->GetModelIndex( STRING( pBackground->GetModelName() ) ); pBackground->AddEffects( EF_NODRAW ); // we will draw for it. } // Find our target and steal its bmodel. CBaseEntity *pTarget = gEntList.FindEntityByName( NULL, m_target ); if( pTarget ) { SetModel( STRING(pTarget->GetModelName()) ); SetAbsOrigin( pTarget->GetAbsOrigin() ); pTarget->AddEffects( EF_NODRAW ); // we will draw for it. } } bool CFuncAreaPortalWindow::IsWindowOpen( const CUtlVector< Vector > &vecOrigins, float fovDistanceAdjustFactor ) { float flClosestDistance = FLT_MAX; for ( int i = 0; i < vecOrigins.Count(); ++i ) { float flDist = CollisionProp()->CalcDistanceFromPoint( vecOrigins[ i ] ); if ( flDist < flClosestDistance ) { flClosestDistance = flDist; } } if ( flClosestDistance == FLT_MAX ) return false; flClosestDistance *= fovDistanceAdjustFactor; return ( flClosestDistance <= (m_flFadeDist + FADE_DIST_BUFFER) ); } bool CFuncAreaPortalWindow::UpdateVisibility( const CUtlVector< Vector > &vecOrigins, float fovDistanceAdjustFactor, bool &bIsOpenOnClient ) { if ( IsWindowOpen( vecOrigins, fovDistanceAdjustFactor ) ) { return BaseClass::UpdateVisibility( vecOrigins, fovDistanceAdjustFactor, bIsOpenOnClient ); } else { bIsOpenOnClient = false; return false; } } //----------------------------------------------------------------------------- // Purpose: Changes the fade start distance // Input: float distance in inches //----------------------------------------------------------------------------- void CFuncAreaPortalWindow::InputSetFadeStartDistance( inputdata_t &inputdata ) { m_flFadeStartDist = inputdata.value.Float(); } //----------------------------------------------------------------------------- // Purpose: Changes the fade end distance // Input: float distance in inches //----------------------------------------------------------------------------- void CFuncAreaPortalWindow::InputSetFadeEndDistance( inputdata_t &inputdata ) { m_flFadeDist = inputdata.value.Float(); }