summaryrefslogtreecommitdiff
path: root/game/client/portal/portal_hud_crosshair.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/portal/portal_hud_crosshair.cpp')
-rw-r--r--game/client/portal/portal_hud_crosshair.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/game/client/portal/portal_hud_crosshair.cpp b/game/client/portal/portal_hud_crosshair.cpp
new file mode 100644
index 0000000..33da2d9
--- /dev/null
+++ b/game/client/portal/portal_hud_crosshair.cpp
@@ -0,0 +1,150 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "hud.h"
+#include "portal_hud_crosshair.h"
+#include "iclientmode.h"
+#include "c_portal_player.h"
+#include "view.h"
+#include "weapon_portalbase.h"
+#include "vgui_controls/Controls.h"
+#include "vgui/ISurface.h"
+#include "ivrenderview.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+extern ConVar crosshair;
+extern ConVar cl_observercrosshair;
+
+using namespace vgui;
+
+int ScreenTransform( const Vector& point, Vector& screen );
+
+DECLARE_HUDELEMENT( CHudPortalCrosshair );
+
+CHudPortalCrosshair::CHudPortalCrosshair( const char *pElementName ) :
+CHudElement( pElementName ), BaseClass( NULL, "HudPortalCrosshair" )
+{
+ vgui::Panel *pParent = g_pClientMode->GetViewport();
+ SetParent( pParent );
+
+ m_pCrosshair = 0;
+
+ m_clrCrosshair = Color( 0, 0, 0, 0 );
+
+ m_vecCrossHairOffsetAngle.Init();
+
+ SetHiddenBits( HIDEHUD_PLAYERDEAD | HIDEHUD_CROSSHAIR );
+}
+
+void CHudPortalCrosshair::ApplySchemeSettings( IScheme *scheme )
+{
+ BaseClass::ApplySchemeSettings( scheme );
+
+ m_pDefaultCrosshair = gHUD.GetIcon("crosshair_default");
+ SetPaintBackgroundEnabled( false );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Save CPU cycles by letting the HUD system early cull
+// costly traversal. Called per frame, return true if thinking and
+// painting need to occur.
+//-----------------------------------------------------------------------------
+bool CHudPortalCrosshair::ShouldDraw()
+{
+ // NOTE: Portal crosshair should no longer be in use, but I'm leaving the code here until X360 lock down... we don't want to draw this ever. -Jeep
+ return false;
+ C_Portal_Player *pPlayer = C_Portal_Player::GetLocalPortalPlayer();
+
+ if ( !pPlayer )
+ return false;
+
+ CWeaponPortalBase *pWeapon = dynamic_cast<CWeaponPortalBase*>( pPlayer->GetActiveWeapon() );
+
+ if ( !pWeapon )
+ return false;
+
+ bool bNeedsDraw = m_pCrosshair &&
+ crosshair.GetInt() &&
+ !engine->IsDrawingLoadingImage() &&
+ !engine->IsPaused() &&
+ g_pClientMode->ShouldDrawCrosshair() &&
+ !( pPlayer->GetFlags() & FL_FROZEN ) &&
+ ( pPlayer->entindex() == render->GetViewEntity() ) &&
+ !pPlayer->IsInVGuiInputMode() &&
+ ( pPlayer->IsAlive() || ( pPlayer->GetObserverMode() == OBS_MODE_IN_EYE ) || ( cl_observercrosshair.GetBool() && pPlayer->GetObserverMode() == OBS_MODE_ROAMING ) );
+
+ return ( bNeedsDraw && CHudElement::ShouldDraw() );
+}
+
+void CHudPortalCrosshair::Paint( void )
+{
+ if ( !m_pCrosshair )
+ return;
+
+ if ( !IsCurrentViewAccessAllowed() )
+ return;
+
+ m_curViewAngles = CurrentViewAngles();
+ m_curViewOrigin = CurrentViewOrigin();
+
+ float x, y;
+ x = ScreenWidth()/2;
+ y = ScreenHeight()/2;
+
+ // MattB - m_vecCrossHairOffsetAngle is the autoaim angle.
+ // if we're not using autoaim, just draw in the middle of the
+ // screen
+ if ( m_vecCrossHairOffsetAngle != vec3_angle )
+ {
+ QAngle angles;
+ Vector forward;
+ Vector point, screen;
+
+ // this code is wrong
+ angles = m_curViewAngles + m_vecCrossHairOffsetAngle;
+ AngleVectors( angles, &forward );
+ VectorAdd( m_curViewOrigin, forward, point );
+ ScreenTransform( point, screen );
+
+ x += 0.5f * screen[0] * ScreenWidth() + 0.5f;
+ y += 0.5f * screen[1] * ScreenHeight() + 0.5f;
+ }
+
+ m_pCrosshair->DrawSelf(
+ x - 0.5f * m_pCrosshair->Width(),
+ y - 0.5f * m_pCrosshair->Height(),
+ m_clrCrosshair );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CHudPortalCrosshair::SetCrosshairAngle( const QAngle& angle )
+{
+ VectorCopy( angle, m_vecCrossHairOffsetAngle );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CHudPortalCrosshair::SetCrosshair( CHudTexture *texture, Color& clr )
+{
+ m_pCrosshair = texture;
+ m_clrCrosshair = clr;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Resets the crosshair back to the default
+//-----------------------------------------------------------------------------
+void CHudPortalCrosshair::ResetCrosshair()
+{
+ Color white(255, 255, 255, 255);
+ SetCrosshair( m_pDefaultCrosshair, white );
+}