diff options
Diffstat (limited to 'game/shared/portal/prop_portal_shared.cpp')
| -rw-r--r-- | game/shared/portal/prop_portal_shared.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/game/shared/portal/prop_portal_shared.cpp b/game/shared/portal/prop_portal_shared.cpp new file mode 100644 index 0000000..f7756b2 --- /dev/null +++ b/game/shared/portal/prop_portal_shared.cpp @@ -0,0 +1,80 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "prop_portal_shared.h" +#include "portal_shareddefs.h" + +#ifdef CLIENT_DLL +#include "c_basedoor.h" +#endif + +CUtlVector<CProp_Portal *> CProp_Portal_Shared::AllPortals; + +const Vector CProp_Portal_Shared::vLocalMins( 0.0f, -PORTAL_HALF_WIDTH, -PORTAL_HALF_HEIGHT ); +const Vector CProp_Portal_Shared::vLocalMaxs( 64.0f, PORTAL_HALF_WIDTH, PORTAL_HALF_HEIGHT ); + +void CProp_Portal_Shared::UpdatePortalTransformationMatrix( const matrix3x4_t &localToWorld, const matrix3x4_t &remoteToWorld, VMatrix *pMatrix ) +{ + VMatrix matPortal1ToWorldInv, matPortal2ToWorld, matRotation; + + //inverse of this + MatrixInverseTR( localToWorld, matPortal1ToWorldInv ); + + //180 degree rotation about up + matRotation.Identity(); + matRotation.m[0][0] = -1.0f; + matRotation.m[1][1] = -1.0f; + + //final + matPortal2ToWorld = remoteToWorld; + *pMatrix = matPortal2ToWorld * matRotation * matPortal1ToWorldInv; +} + +static char *g_pszPortalNonTeleportable[] = +{ + "func_door", + "func_door_rotating", + "prop_door_rotating", + "func_tracktrain", + //"env_ghostanimating", + "physicsshadowclone" +}; + +bool CProp_Portal_Shared::IsEntityTeleportable( CBaseEntity *pEntity ) +{ + + do + { + +#ifdef CLIENT_DLL + //client + + if( dynamic_cast<C_BaseDoor *>(pEntity) != NULL ) + return false; + +#else + //server + + for( int i = 0; i != ARRAYSIZE(g_pszPortalNonTeleportable); ++i ) + { + if( FClassnameIs( pEntity, g_pszPortalNonTeleportable[i] ) ) + return false; + } + +#endif + + Assert( pEntity != pEntity->GetMoveParent() ); + pEntity = pEntity->GetMoveParent(); + } while( pEntity ); + + return true; +} + + + + |