diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/c_vguiscreen.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/c_vguiscreen.h')
| -rw-r--r-- | game/client/c_vguiscreen.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/game/client/c_vguiscreen.h b/game/client/c_vguiscreen.h new file mode 100644 index 0000000..e62cba1 --- /dev/null +++ b/game/client/c_vguiscreen.h @@ -0,0 +1,183 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef C_VGUISCREEN_H +#define C_VGUISCREEN_H + +#ifdef _WIN32 +#pragma once +#endif + + +#include <vgui_controls/EditablePanel.h> +#include "c_baseentity.h" +#include "panelmetaclassmgr.h" + +class KeyValues; + + +//----------------------------------------------------------------------------- +// Helper macro to make overlay factories one line of code. Use like this: +// DECLARE_VGUI_SCREEN_FACTORY( CVguiScreenPanel, "image" ); +//----------------------------------------------------------------------------- +struct VGuiScreenInitData_t +{ + C_BaseEntity *m_pEntity; + + VGuiScreenInitData_t() : m_pEntity(NULL) {} + VGuiScreenInitData_t( C_BaseEntity *pEntity ) : m_pEntity(pEntity) {} +}; + +#define DECLARE_VGUI_SCREEN_FACTORY( _PanelClass, _nameString ) \ + DECLARE_PANEL_FACTORY( _PanelClass, VGuiScreenInitData_t, _nameString ) + + +//----------------------------------------------------------------------------- +// Base class for vgui screen panels +//----------------------------------------------------------------------------- +class CVGuiScreenPanel : public vgui::EditablePanel +{ + DECLARE_CLASS_GAMEROOT( CVGuiScreenPanel, vgui::EditablePanel ); + +public: + CVGuiScreenPanel( vgui::Panel *parent, const char *panelName ); + CVGuiScreenPanel( vgui::Panel *parent, const char *panelName, vgui::HScheme hScheme ); + virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ); + vgui::Panel *CreateControlByName(const char *controlName); + virtual void OnCommand( const char *command ); + +protected: + C_BaseEntity *GetEntity() const { return m_hEntity.Get(); } + +private: + EHANDLE m_hEntity; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class C_VGuiScreen : public C_BaseEntity +{ + DECLARE_CLASS( C_VGuiScreen, C_BaseEntity ); +public: + DECLARE_CLIENTCLASS(); + + C_VGuiScreen(); + ~C_VGuiScreen(); + + virtual void PreDataUpdate( DataUpdateType_t updateType ); + virtual void OnDataChanged( DataUpdateType_t type ); + virtual int DrawModel( int flags ); + virtual bool ShouldDraw( void ); + virtual void ClientThink( ); + virtual void GetAimEntOrigin( IClientEntity *pAttachedTo, Vector *pOrigin, QAngle *pAngles ); + virtual bool IsVisibleToPlayer( C_BasePlayer *pViewingPlayer ); + virtual bool IsTransparent( void ); + + const char *PanelName() const; + + // The view screen has the cursor pointing at it + void GainFocus( ); + void LoseFocus(); + + // Button state... + void SetButtonState( int nButtonState ); + + // Is the screen backfaced given a view position? + bool IsBackfacing( const Vector &viewOrigin ); + + // Return intersection point of ray with screen in barycentric coords + bool IntersectWithRay( const Ray_t &ray, float *u, float *v, float *t ); + + // Is the screen turned on? + bool IsActive() const; + + // Are we only visible to teammates? + bool IsVisibleOnlyToTeammates() const; + + // Are we visible to someone on this team? + bool IsVisibleToTeam( int nTeam ); + + bool IsAttachedToViewModel() const; + + virtual RenderGroup_t GetRenderGroup(); + + bool AcceptsInput() const; + void SetAcceptsInput( bool acceptsinput ); + + C_BasePlayer *GetPlayerOwner( void ); + bool IsInputOnlyToOwner( void ); + +private: + // Vgui screen management + void CreateVguiScreen( const char *pTypeName ); + void DestroyVguiScreen( ); + + // Computes the panel to world transform + void ComputePanelToWorld(); + + // Computes control points of the quad describing the screen + void ComputeEdges( Vector *pUpperLeft, Vector *pUpperRight, Vector *pLowerLeft ); + + // Writes the z buffer + void DrawScreenOverlay(); + +private: + int m_nPixelWidth; + int m_nPixelHeight; + float m_flWidth; + float m_flHeight; + int m_nPanelName; // The name of the panel + int m_nButtonState; + int m_nButtonPressed; + int m_nButtonReleased; + int m_nOldPx; + int m_nOldPy; + int m_nOldButtonState; + int m_nAttachmentIndex; + int m_nOverlayMaterial; + int m_fScreenFlags; + + int m_nOldPanelName; + int m_nOldOverlayMaterial; + + bool m_bLoseThinkNextFrame; + + bool m_bAcceptsInput; + + CMaterialReference m_WriteZMaterial; + CMaterialReference m_OverlayMaterial; + + VMatrix m_PanelToWorld; + + CPanelWrapper m_PanelWrapper; + + CHandle<C_BasePlayer> m_hPlayerOwner; +}; + + +//----------------------------------------------------------------------------- +// Returns an entity that is the nearby vgui screen; NULL if there isn't one +//----------------------------------------------------------------------------- +C_BaseEntity *FindNearbyVguiScreen( const Vector &viewPosition, const QAngle &viewAngle, int nTeam = -1 ); + + +//----------------------------------------------------------------------------- +// Activates/Deactivates vgui screen +//----------------------------------------------------------------------------- +void ActivateVguiScreen( C_BaseEntity *pVguiScreen ); +void DeactivateVguiScreen( C_BaseEntity *pVguiScreen ); + + +//----------------------------------------------------------------------------- +// Updates vgui screen button state +//----------------------------------------------------------------------------- +void SetVGuiScreenButtonState( C_BaseEntity *pVguiScreen, int nButtonState ); + + +#endif // C_VGUISCREEN_H + |