Team Fortress 2 Source Code as on 22/4/2020
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.

224 lines
6.7 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #include "cbase.h"
  7. #include "hud.h"
  8. #include "hudelement.h"
  9. #include "hud_macros.h"
  10. #include "hud_numericdisplay.h"
  11. #include "iclientmode.h"
  12. #include "c_dod_player.h"
  13. #include "VGuiMatSurface/IMatSystemSurface.h"
  14. #include "materialsystem/imaterial.h"
  15. #include "materialsystem/imesh.h"
  16. #include "materialsystem/imaterialvar.h"
  17. #include <vgui/IScheme.h>
  18. #include <vgui/ISurface.h>
  19. #include <KeyValues.h>
  20. #include <vgui_controls/AnimationController.h>
  21. //for screenfade
  22. #include "ivieweffects.h"
  23. #include "shake.h"
  24. #include "weapon_dodbasegun.h"
  25. // memdbgon must be the last include file in a .cpp file!!!
  26. #include "tier0/memdbgon.h"
  27. //-----------------------------------------------------------------------------
  28. // Purpose: Draws the zoom screen
  29. //-----------------------------------------------------------------------------
  30. class CHudScope : public vgui::Panel, public CHudElement
  31. {
  32. DECLARE_CLASS_SIMPLE( CHudScope, vgui::Panel );
  33. public:
  34. CHudScope( const char *pElementName );
  35. void Init( void );
  36. protected:
  37. virtual void ApplySchemeSettings(vgui::IScheme *scheme);
  38. virtual void Paint( void );
  39. private:
  40. int m_iScopeSpringfield[4];
  41. int m_iScopeK98[4];
  42. };
  43. DECLARE_HUDELEMENT_DEPTH( CHudScope, 100 );
  44. using namespace vgui;
  45. //-----------------------------------------------------------------------------
  46. // Purpose: Constructor
  47. //-----------------------------------------------------------------------------
  48. CHudScope::CHudScope( const char *pElementName ) : CHudElement(pElementName), BaseClass(NULL, "HudScope")
  49. {
  50. vgui::Panel *pParent = g_pClientMode->GetViewport();
  51. SetParent( pParent );
  52. SetHiddenBits( HIDEHUD_PLAYERDEAD );
  53. }
  54. //-----------------------------------------------------------------------------
  55. // Purpose: standard hud element init function
  56. //-----------------------------------------------------------------------------
  57. void CHudScope::Init( void )
  58. {
  59. int i;
  60. for( i=0;i<4;i++ )
  61. {
  62. m_iScopeSpringfield[i] = vgui::surface()->CreateNewTextureID();
  63. m_iScopeK98[i] = vgui::surface()->CreateNewTextureID();
  64. }
  65. vgui::surface()->DrawSetTextureFile(m_iScopeSpringfield[0], "sprites/scopes/scope_spring_ul", true, false);
  66. vgui::surface()->DrawSetTextureFile(m_iScopeSpringfield[1], "sprites/scopes/scope_spring_ur", true, false);
  67. vgui::surface()->DrawSetTextureFile(m_iScopeSpringfield[2], "sprites/scopes/scope_spring_lr", true, false);
  68. vgui::surface()->DrawSetTextureFile(m_iScopeSpringfield[3], "sprites/scopes/scope_spring_ll", true, false);
  69. vgui::surface()->DrawSetTextureFile(m_iScopeK98[0], "sprites/scopes/scope_k43_ul", true, false);
  70. vgui::surface()->DrawSetTextureFile(m_iScopeK98[1], "sprites/scopes/scope_k43_ur", true, false);
  71. vgui::surface()->DrawSetTextureFile(m_iScopeK98[2], "sprites/scopes/scope_k43_lr", true, false);
  72. vgui::surface()->DrawSetTextureFile(m_iScopeK98[3], "sprites/scopes/scope_k43_ll", true, false);
  73. }
  74. //-----------------------------------------------------------------------------
  75. // Purpose: sets scheme colors
  76. //-----------------------------------------------------------------------------
  77. void CHudScope::ApplySchemeSettings( vgui::IScheme *scheme )
  78. {
  79. BaseClass::ApplySchemeSettings(scheme);
  80. SetPaintBackgroundEnabled(false);
  81. SetPaintBorderEnabled(false);
  82. int screenWide, screenTall;
  83. GetHudSize(screenWide, screenTall);
  84. SetBounds(0, 0, screenWide, screenTall);
  85. }
  86. //-----------------------------------------------------------------------------
  87. // Purpose: draws the zoom effect
  88. //-----------------------------------------------------------------------------
  89. void CHudScope::Paint( void )
  90. {
  91. C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer();
  92. if ( pPlayer == NULL )
  93. return;
  94. if( pPlayer->GetFOV() >= 90.0f )
  95. return;
  96. CWeaponDODBase *pWeapon = pPlayer->GetActiveDODWeapon();
  97. if( !pWeapon )
  98. return;
  99. Assert( m_iScopeSpringfield );
  100. Assert( m_iScopeK98 );
  101. int *piScopeTex = NULL;
  102. switch( pWeapon->GetWeaponID() )
  103. {
  104. case WEAPON_SPRING:
  105. piScopeTex = m_iScopeSpringfield;
  106. break;
  107. case WEAPON_K98_SCOPED:
  108. piScopeTex = m_iScopeK98;
  109. break;
  110. default:
  111. return;
  112. }
  113. if( !piScopeTex )
  114. return;
  115. // see if we're zoomed with a sniper rifle
  116. if( pPlayer->GetFOV() < 90 &&
  117. pWeapon->GetDODWpnData().m_WeaponType == WPN_TYPE_SNIPER )
  118. {
  119. int screenWide, screenTall;
  120. GetHudSize(screenWide, screenTall);
  121. // calculate the bounds in which we should draw the scope
  122. int xMid = screenWide / 2;
  123. int yMid = screenTall / 2;
  124. // width of the drawn scope. in widescreen, we draw the sides with primitives
  125. int wide = ( screenTall / 3 ) * 4;
  126. int xLeft = xMid - wide/2;
  127. int xRight = xMid + wide/2;
  128. int yTop = 0;
  129. int yBottom = screenTall;
  130. float uv1 = 0.5f / 256.0f, uv2 = 1.0f - uv1;
  131. vgui::Vertex_t vert[4];
  132. Vector2D uv11( uv1, uv1 );
  133. Vector2D uv12( uv1, uv2 );
  134. Vector2D uv21( uv2, uv1 );
  135. Vector2D uv22( uv2, uv2 );
  136. vgui::surface()->DrawSetColor(0,0,0,255);
  137. //Draw the outline
  138. //upper left
  139. vgui::surface()->DrawSetTexture(piScopeTex[0]);
  140. vert[0].Init( Vector2D( xLeft, yTop ), uv11 );
  141. vert[1].Init( Vector2D( xMid, yTop ), uv21 );
  142. vert[2].Init( Vector2D( xMid, yMid ), uv22 );
  143. vert[3].Init( Vector2D( xLeft, yMid ), uv12 );
  144. vgui::surface()->DrawTexturedPolygon(4, vert);
  145. // top right
  146. vgui::surface()->DrawSetTexture(piScopeTex[1]);
  147. vert[0].Init( Vector2D( xMid - 1, yTop ), uv11 );
  148. vert[1].Init( Vector2D( xRight, yTop ), uv21 );
  149. vert[2].Init( Vector2D( xRight, yMid + 1 ), uv22 );
  150. vert[3].Init( Vector2D( xMid - 1, yMid + 1 ), uv12 );
  151. vgui::surface()->DrawTexturedPolygon(4, vert);
  152. // bottom right
  153. vgui::surface()->DrawSetTexture(piScopeTex[2]);
  154. vert[0].Init( Vector2D( xMid, yMid ), uv11 );
  155. vert[1].Init( Vector2D( xRight, yMid ), uv21 );
  156. vert[2].Init( Vector2D( xRight, yBottom ), uv22 );
  157. vert[3].Init( Vector2D( xMid, yBottom ), uv12 );
  158. vgui::surface()->DrawTexturedPolygon( 4, vert );
  159. // bottom left
  160. vgui::surface()->DrawSetTexture(piScopeTex[3]);
  161. vert[0].Init( Vector2D( xLeft, yMid ), uv11 );
  162. vert[1].Init( Vector2D( xMid, yMid ), uv21 );
  163. vert[2].Init( Vector2D( xMid, yBottom ), uv22 );
  164. vert[3].Init( Vector2D( xLeft, yBottom), uv12 );
  165. vgui::surface()->DrawTexturedPolygon(4, vert);
  166. if ( wide < screenWide )
  167. {
  168. // Left block
  169. vgui::surface()->DrawFilledRect( 0, 0, xLeft, screenTall );
  170. // Right block
  171. vgui::surface()->DrawFilledRect( xRight, 0, screenWide, screenTall );
  172. }
  173. if ( pWeapon->GetWeaponID() == WEAPON_SPRING )
  174. {
  175. //Draw the reticle with primitives
  176. vgui::surface()->DrawLine( 0, yMid, screenWide, yMid );
  177. vgui::surface()->DrawLine( xMid, 0, xMid, screenTall );
  178. }
  179. }
  180. }