|
|
//========= 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(); }
|